Slide 1

Slide 1 text

実践ジオフェンス : 効率的に開発するために iOSDC 2024 LT Naoki Ishii

Slide 2

Slide 2 text

所属 株式会社ナビタイムジャパン 担当サービス auナビウォーク 担当領域 Android/iPhoneアプリの開発 (Androidのほうが長め) 石井 直貴 自己紹介 @IIInaIII

Slide 3

Slide 3 text

位置乗降アラーム 駅やバス停に近づくと、アラームでお知らせしてくれる auナビウォーク

Slide 4

Slide 4 text

地理的な領域に入った/出たことを検知できる 仕組み アプリが起動していない状態でも、出入り があったときに起動してくれる → バッテリーに優しい機能を提供可能 ジオフェンスとは

Slide 5

Slide 5 text

事情 シミュレータを使った開発ができない アプリで使っている3rdパーティライブラリにシミュレータ のフレームワークが用意されていないため iOSは実機での位置偽装が手軽にできない Androidは手軽にできる → 外に出て確認する必要があった

Slide 6

Slide 6 text

今日話すこと Q iOS実機でのジオフェンス機能の確認で役立ったこ0 Q AndroidとiOS両方実装したので、各OSの仕様の違いを踏まえて紹介 API iOS17以降で使える新しい方法がありますが、 今回は古くから使えるCLLocationManagerの機能を使った実装となっています

Slide 7

Slide 7 text

ジオフェンスを使った機能の開発 ( 位置情報の許可を取得する G CLLocationManagerの startMonitoringを呼ぶ S 通知を受け取る
 delegateを定義する 「常に許可」が必要

Slide 8

Slide 8 text

ジオフェンスを使った機能の開発 ( 位置情報の許可を取得する G CLLocationManagerの startMonitoringを呼ぶ region = ( : CLLocationCoordinate2D( : , : ), : , : ) . . ( : region) let self CLCircularRegion center latitude longitude radius identifier startMonitoring for 139.7150326 35.6671881 500 "identifier" locationManager Ž 通知を受け取る
 delegateを定義する 範囲指定

Slide 9

Slide 9 text

ジオフェンスを使った機能の開発 ( 位置情報の許可を取得する G CLLocationManagerの startMonitoringを呼ぶ extension func : { ( manager: , region: ) { ( : region) } } AppDelegate CLLocationManagerDelegate CLLocationManager CLRegion locationManager didEnterRegion _ handleGeofenceEnter region ‡ 通知を受け取る
 delegateを定義する

Slide 10

Slide 10 text

ジオフェンスを使った機能の開発 ( 位置情報の許可を取得する G CLLocationManagerの startMonitoringを呼ぶ S 通知を受け取る
 delegateを定義する extension func : { ( manager: , region: ) { ( : region) } } AppDelegate CLLocationManagerDelegate CLLocationManager CLRegion locationManager didEnterRegion _ handleGeofenceEnter region かんたん!

Slide 11

Slide 11 text

開発時苦労したことが結構ありました

Slide 12

Slide 12 text

事象その1 : 通知が来ない

Slide 13

Slide 13 text

事象その1  通知が来ない 実装できた! いざ、ジオフェンスを設置した駅へ! ジオフェンスを設置したはずの範囲に近づいても一向に通知が来ない‥

Slide 14

Slide 14 text

事象その1  通知が来ない 原因 a 緯度経度の測地系の問P a アプリでは世界測地系を利用しているが、バック エンドから渡される測地系が日本測地系になって い a 決まった方向、距離にずれる 想定した範囲 実際設置された範囲

Slide 15

Slide 15 text

事象その1  通知が来ない 対処 R 開発用メニューに、地図にジオフェンス範囲を表示 する設定を追2 R 地図上に、ジオフェンスを設置した位置を可視 R どの範囲に設置されているかわかりやすくなる

Slide 16

Slide 16 text

事象その2 : 再び、通知が来ない

Slide 17

Slide 17 text

事象その2  再び、通知が来ない 無事ジオフェンス通知が来るようになった。 しかし、ある時からジオフェンスを設置したは ずの範囲に近づいても通知が来ない‥

Slide 18

Slide 18 text

事象その2  再び、通知が来ない 原因 Q ジオフェンスの設置可能上限の問h Q iOSのジオフェンスの設置上限は、1アプリ20個まD Q 実装して、外に出て確認、
 を何度も繰り返しているうちにジオフェンス設置上 限に達してしまっw Q Androidのジオフェンスの設置上限は、1アプリ100 個までだったので油断していた

Slide 19

Slide 19 text

対処1 4 startMonitoringが失敗していたことに気づかなかったのが問0 4 成功/失敗のdelegate通知を拾い、開発中はNotificationで表示するようにした func func any (_ manager: , region: ) { // ジオフェンス設置成功 } (_ manager: , region: ?, error: ){ // ジオフェンス設置失敗 } locationManager didStartMonitoringFor locationManager monitoringDidFailFor withError CLLocationManager CLRegion CLLocationManager CLRegion Error 事象その2  再び、通知が来ない

Slide 20

Slide 20 text

対処2 F 設置しようとした時に、上限に達していたらエラーUIを出す ようにした 
 (設置中のジオフェンスはmonitoredRegionsで取得可能 F Androidは100個までだったので、エラー考慮をしていな かったのですが、後でエラーUIを追加しました CLLocationManager. : < > monitoredRegions Set CLRegion 事象その2  再び、通知が来ない

Slide 21

Slide 21 text

事象その3 : 通知が遅れる

Slide 22

Slide 22 text

事象その3  通知が遅れる 公共交通機関での移動時の利用を想定 固定で300mといった共通範囲で実装していたが、
 バスや電車に乗って確認してみると、、 バスでは良い感じだけど電車では遅すぎる…といった 挙動

Slide 23

Slide 23 text

事象その3  通知が遅れる 原因 c 範囲内に入ったらすぐにジオフェンス通知が来るわけではなく、
 何かしらの判定をしてから通知を行っていそe c (今はないが)公式ドキュメントに、
 「範囲内に入ってから、20秒同じ位置にいた場合に通知が来る」
 という記載があったことがあるらしR c 移動スピード他、環境によっても通知の受信にばらつきが出そう
 (地下鉄が遅いのは予想どおり)

Slide 24

Slide 24 text

事象その3  通知が遅れる 対処 移動手段共通の範囲、を変更し
 範囲を設定してもらうような仕様にした

Slide 25

Slide 25 text

まとめ 通知が来ない ' ジオフェンスを設置した範囲を可視化しよう それでも、通知が来ない ' 開発時は失敗のNotificationを出したり、ジオフェンス上限 エラーを考慮したUIを提供しよう 通知が遅れる ' ジオフェンス通知の遅れを考慮した仕様にしよう

Slide 26

Slide 26 text

素敵なジオフェンスライフを!