Skip to main content
プレビュー版です — 正式リリースではありません。 Flutter SDK は評価用に提供しており、API が変わる可能性があります。 正式サポートの SDK は iOS · Android SDK です。
Flutter SDK は OneS1ght iOS・Android SDK をラップしたプラグインです。測位、ゾーンの入退場・滞在判定、送信・再試行はすべて ネイティブ SDK が行い、Dart は呼び出しを渡して結果を Dart の型に変換するだけです。そのため、アプリがバックグラウンドに移って Dart が止まっても、SDK の動作はネイティブアプリと同じです。
Dart API の名前は iOS SDK に合わせており、ネイティブのコールバック(onZoneEnter・onPosition など)は同じ名前の Stream です。

要件

測位できない端末でもアプリは正常に動作し、測位のみ無効になります。 SDK を実際に動作させるには、以下の準備が必要です。詳しくは SDK 導入前のチェックリストをご覧ください。

導入

pubspec.yaml に git 依存として追加します。プレビュー版のため pub.dev には公開していません。
ref には タグ(v0.0.1) を指定してください。main を指定すると、リポジトリが更新されるたびにアプリのビルドが知らないうちに変わります。

iOS の設定

Swift Package Manager でのみ組み込めます。 CocoaPods には対応していません — 測位エンジンが動的フレームワークのため、 CocoaPods ではアプリに含まれず、起動直後にアプリが終了します。Swift Package Manager が無効な場合、pod install は次の コマンドを案内して停止します。
iOS のデプロイメントターゲットを 18.0 に上げます(ios/Runner.xcodeproj → IPHONEOS_DEPLOYMENT_TARGET)。 ios/Runner/Info.plist に次のキーを追加します。最初の 3 つがないと、権限をリクエストした時点でアプリが終了します。
NSLocationTemporaryUsageDescriptionDictionary 内のキーは Positioning にしてください。異なると iOS はエラーもログも 出さずにリクエストを無視します。
iOS 27.2 以降では、位置情報の権限が「常に」でないとフロアを検出できません。 NSLocationAlwaysAndWhenInUseUsageDescription を追加し、「使用中のみ」が許可された後にアプリから「常に」をリクエストしてください(例: permission_handler の Permission.locationAlways.request())。SDK は「常に」を リクエストしません。理由は iOS 連携ガイド をご覧ください。
UIBackgroundModes に bluetooth-central は追加しないでください。SDK はバックグラウンドで測位を止めるためこのモードを使わず、 App Store 審査で未使用のバックグラウンドモード(2.5.4)としてリジェクトされる可能性があります。

Android の設定

MainActivity を FlutterFragmentActivity に変更します。SDK の権限リクエストには ComponentActivity が必要ですが、 Flutter 既定の FlutterActivity はそうではありません。
android/app/build.gradle.kts でビルドバージョンを合わせます。
測位の権限(RANGING・ACCESS_FINE_LOCATION・ACCESS_COARSE_LOCATION・BLUETOOTH_SCAN)と INTERNET は Android SDK の マニフェストから自動でマージされます。別途追加する必要はありません。

SDK の初期化

アプリ起動時に 1 回呼び出します。キーの検証とテナント設定の受信をあわせて行います。
  • 失敗すると OneS1ghtException を投げます — もう一度呼び出すと再試行になります。
  • 成功後に再度呼び出しても無視され、別のキーで呼び出すとセッションを作り直します。
  • 端末が対応しているかはここでは確認しません。測位できない端末でも建物・フロア・ゾーンは取得できます。

環境別 API キーの使い分け

OneS1ght コンソールでは API キーを開発用(Development)と本番用(Production)に分けて発行できます。キーはコードに書かず、 ビルド時に渡すことをおすすめします。

端末対応の確認

Android では deviceAvailability() を initialize() の後に 読んでください。それより前は UWB チップを確認できないため deviceNotSupported が返り、デバッグログに警告が残ります。iOS はいつ読んでも構いません。

権限のリクエスト

  • すでに回答済みの権限であれば、ダイアログなしですぐに返ります。initialize の前でも呼び出せます。
  • iOS は Nearby Interaction の権限を求め、位置情報の権限は測位開始時に SDK が求めます。Android は UWB・正確な位置情報・ 付近のデバイスの権限をまとめて求めます。
  • Android で MainActivity が FlutterFragmentActivity でない場合、コード unsupportedActivity のエラーになります。

プロフィールの作成と連携

  • 属性は自由に決められます。年齢は正確な値ではなく年代("20s")をおすすめします。
  • ログアウトなどで連携を解除するときは identify(profileId: null) を呼び出します。
  • 取得・置換・削除: fetchProfile(id) · replaceProfile(id, attributes: …)(全体置換) · deleteProfile(id)。

建物・フロアの選択(任意)

setFloorMap を呼び出さない場合、測位エンジンが BLE でフロアを探します。最初の指定時は buildingId もあわせて渡してください (ないと E3001)。setFloorMap(null) はフロアの指定を解除します。

エンジンが見つけたフロアに追従する

図面の表示

floors() の一覧では図面画像が空です。地図を描くフロアだけ floor(buildingId:, floorId:) で取得すると、image(元のバイト列) が入ります。座標は図面ローカルのメートルで、originX・originY・widthM・heightM で画面座標に変換します。

測位の開始と終了

begin() が失敗すると OneS1ghtException を投げます — E1001(未初期化) · E1004(identify 未呼び出し) · E2001(OS が古い) · E2002(非対応端末)。

一時停止と再開

測位が閉じたとき

イベントの受信

イベントはすべて Stream です。複数の場所で同時に受信しても構いません。

ゾーン情報の更新

コンソール変更の受信

SDK はこの通知を受けても何もしません。ゾーンを取り直すたびに入退場判定が最初からやり直しになるため、続けて届く ZonesChanged はまとめて 1 回だけ処理してください。

データ送信の制御

セッションのリセット

エラー処理

失敗はすべて OneS1ghtException です。code はネイティブ SDK の エラーコード で、iOS・Android で 同じです。

デバッグログ

ログレベルと読み方は ログの使い方 をご覧ください。本番ビルドでは購読しないことをおすすめします。 SDK のログ・案内文の言語は OneS1ght.setLanguage('ja') で指定できます('ko'・'ja'・'en'、null は端末の言語)。

バックグラウンドでの動作

UWB 測位は iOS・Android ともに フォアグラウンド専用 です。アプリがバックグラウンドに移ると、ネイティブ SDK が測位を止めて 残りの座標を送信します。これは Dart ではなくネイティブ SDK が行うため、Flutter アプリでも同じです。
実際の測位はシミュレーター・エミュレーターでは確認できません。UWB 対応の実機にインストールしてテストしてください。

ネイティブ SDK との違い

トラブルシューティング

ログの使い方

開発中のログの使い方をご案内します。

エラーコード

開発中に発生するエラーの内容をご案内します。