Flutter SDK は OneS1ght iOS・Android SDK をラップしたプラグインです。測位、ゾーンの入退場・滞在判定、送信・再試行はすべて
ネイティブ SDK が行い、Dart は呼び出しを渡して結果を Dart の型に変換するだけです。そのため、アプリがバックグラウンドに移って
Dart が止まっても、SDK の動作はネイティブアプリと同じです。
Dart API の名前は iOS SDK に合わせており、ネイティブのコールバック(
Dart API の名前は iOS SDK に合わせており、ネイティブのコールバック(
onZoneEnter・onPosition など)は同じ名前の Stream です。要件
測位できない端末でもアプリは正常に動作し、測位のみ無効になります。
SDK を実際に動作させるには、以下の準備が必要です。詳しくは
SDK 導入前のチェックリストをご覧ください。
導入
pubspec.yaml に git 依存として追加します。プレビュー版のため pub.dev には公開していません。
iOS の設定
Swift Package Manager でのみ組み込めます。 CocoaPods には対応していません — 測位エンジンが動的フレームワークのため、 CocoaPods ではアプリに含まれず、起動直後にアプリが終了します。Swift Package Manager が無効な場合、pod install は次の
コマンドを案内して停止します。
ios/Runner.xcodeproj → IPHONEOS_DEPLOYMENT_TARGET)。
ios/Runner/Info.plist に次のキーを追加します。最初の 3 つがないと、権限をリクエストした時点でアプリが終了します。
NSLocationAlwaysAndWhenInUseUsageDescription
を追加し、「使用中のみ」が許可された後にアプリから「常に」をリクエストしてください(例:
permission_handler の Permission.locationAlways.request())。SDK は「常に」を
リクエストしません。理由は iOS 連携ガイド をご覧ください。
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 です。複数の場所で同時に受信しても構いません。
ゾーン情報の更新
コンソール変更の受信
データ送信の制御
セッションのリセット
エラー処理
失敗はすべてOneS1ghtException です。code はネイティブ SDK の エラーコード で、iOS・Android で
同じです。
デバッグログ
OneS1ght.setLanguage('ja') で指定できます('ko'・'ja'・'en'、null は端末の言語)。
バックグラウンドでの動作
実際の測位はシミュレーター・エミュレーターでは確認できません。UWB 対応の実機にインストールしてテストしてください。
ネイティブ SDK との違い
トラブルシューティング
ログの使い方
開発中のログの使い方をご案内します。
エラーコード
開発中に発生するエラーの内容をご案内します。