概要
ここでは、Flutterアプリにジオフェンシング機能を実装した際の備忘録を残します。 Android・iOSを対象とし、デスクトップやWebは対象外です。細かな実装部分は各公式サイトの初回にとどめる場合があります。
実装ステップ
- Androidにジオフェンシング機能を実装する
- iOSにジオフェンシング機能を実装する
- Dartからジオフェンシング機能を開始/終了する
- AndroidからDartにジオフェンシングin/outを通知する
- iOSからDartにジオフェンシングin/outを通知する
- 位置情報使用の説明画面を作成する
- ストアリリースの準備をする
Androidにジオフェンシング機能を実装する
まずはAndroid公式の情報を確認
権限の設定
位置情報に関する権限をAndroidManifest.xmlに追記します。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
ジオフェンシング出入り検知Receiverの作成
ジオフェンシングの出入りを受信するReceiverを作成します。実装自体はAndroid公式がそのまま参考になります。
Workerの作成
Receiverで受信した情報をFlutter側に送りたい場合、ListenableWorkerを使用します。
Workerの中でFlutterEngine、MethodChannelを使用して事前にFlutter側で登録しておいた処理を呼び出します。
あまり参考になる記事を見つける事が出来なかったのですが、今ならAIに聞けば参考になる情報を教えてくれるかもしれません。
ここは実装当時はとても苦労しました。実アプリ上だとデバッグも手間だったため、プラグインとして切り出し、exampleのアプリを作成して進めました。
今から作るなら、アプリ本体に組み込むより最初からプラグインとして作るのがおすすめです。
Workerの呼び出し
私の場合はOneTimeWorkRequestBuilderを使って、下記のように呼び出す作りにしました。
WorkManager.getInstance(context).enqueueUniqueWork("[work名称]", ExistingWorkPolicy.KEEP, request)
ジオフェンスの作成
Geofence.Builderを使用してジオフェンスを作成する処理を作ります。この時、ジオフェンスの半径、有効期限、出入りのタイプなど設定する必要があります。値の作成方法はアプリの種類によって様々と思いますが、私の場合はCMSで登録する仕組みを準備しました。
1アプリが登録可能なジオフェンスは100個までです。半径や有効期限に上限はないと思いますが、半径は数m〜数kmまでさまざまに設定可能です。公式では100mが推奨されているようです。
精度や頻度についてはバッテリー駆動時間についてを参照しながらベストのところを探るのが良いと思います。バッテリー消費が多いとアンインストール筆頭候補になるのでこの辺は重要ですね。
ジオフェンスの登録
作成したジオフェンスは、GeofencingRequestで登録できます。
登録先のGeofencingClientはアプリ起動時等にインスタンスを作成・保持しておく作りにしました。