Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
実践ジオフェンス 効率的に開発するために
Search
NAVITIME JAPAN
PRO
August 26, 2024
Technology
3
250
実践ジオフェンス 効率的に開発するために
2024/08/22-24に開催された「iOSDC Japan 2024」で発表した資料です
https://iosdc.jp/2024/
NAVITIME JAPAN
PRO
August 26, 2024
Tweet
Share
More Decks by NAVITIME JAPAN
See All by NAVITIME JAPAN
つよつよリーダーが 抜けたらどうする? 〜ナビタイムのAgile⽀援組織の変遷〜
navitimejapan
PRO
22
14k
安全で使いやすいCarPlayアプリの 魅せ方:HIGと実例から学ぶ
navitimejapan
PRO
1
84
見えないユーザの声はログに埋もれている! ~ログから具体的なユーザの体験を数値化した事例紹介~
navitimejapan
PRO
6
2.3k
ユーザーのためなら 『デザイン』 以外にも手を伸ばせる
navitimejapan
PRO
2
1.3k
フツーのIT女子が、 Engineering Managerになるまで
navitimejapan
PRO
3
220
不確実性に打ち勝つOKR戦略/How to manage uncertainty with OKR strategy
navitimejapan
PRO
4
3.2k
アジャイルを小さいままで 組織に広める 二周目 / Agile Transformation in NAVITIME JAPAN iteration 2
navitimejapan
PRO
4
1.2k
変更障害率0%よりも「継続的な学習と実験」を価値とする 〜障害を「起こってはならないもの」としていた組織がDirtの実施に至るまで〜 / DevOps Transformation in NAVITIME JAPAN
navitimejapan
PRO
7
5.2k
こうしてふりかえりは終わってしまった / A Demise of a retrospective
navitimejapan
PRO
44
28k
Other Decks in Technology
See All in Technology
2024年グライダー曲技世界選手権参加報告/2024 WGAC report
jscseminar
0
290
隣接領域をBeyondするFinatextのエンジニア組織設計 / beyond-engineering-areas
stajima
1
240
Amplify Gen2 Deep Dive / バックエンドの型をいかにしてフロントエンドへ伝えるか #TSKaigi #TSKaigiKansai #AWSAmplifyJP
tacck
PRO
0
200
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
310
インフラとバックエンドとフロントエンドをくまなく調べて遅いアプリを早くした件
tubone24
1
370
Intuneお役立ちツールのご紹介
sukank
3
770
rootlessコンテナのすゝめ - 研究室サーバーでもできる安全なコンテナ管理
kitsuya0828
1
130
データ活用促進のためのデータ分析基盤の進化
takumakouno
2
770
20241108_CS_LLMMT
shigashiyama
0
260
【令和最新版】AWS Direct Connectと愉快なGWたちのおさらい
minorun365
PRO
5
630
TanStack Routerに移行するのかい しないのかい、どっちなんだい! / Are you going to migrate to TanStack Router or not? Which one is it?
kaminashi
0
270
OCI Data Integration技術情報 / ocidi_technical_jp
oracle4engineer
PRO
1
2.6k
Featured
See All Featured
KATA
mclloyd
29
14k
RailsConf 2023
tenderlove
29
900
Speed Design
sergeychernyshev
24
610
A Philosophy of Restraint
colly
203
16k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Designing Experiences People Love
moore
138
23k
Scaling GitHub
holman
458
140k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
27
2k
Transcript
実践ジオフェンス : 効率的に開発するために iOSDC 2024 LT Naoki Ishii
所属 株式会社ナビタイムジャパン 担当サービス auナビウォーク 担当領域 Android/iPhoneアプリの開発 (Androidのほうが長め) 石井 直貴 自己紹介
@IIInaIII
位置乗降アラーム 駅やバス停に近づくと、アラームでお知らせしてくれる auナビウォーク
地理的な領域に入った/出たことを検知できる 仕組み アプリが起動していない状態でも、出入り があったときに起動してくれる → バッテリーに優しい機能を提供可能 ジオフェンスとは
事情 シミュレータを使った開発ができない アプリで使っている3rdパーティライブラリにシミュレータ のフレームワークが用意されていないため iOSは実機での位置偽装が手軽にできない Androidは手軽にできる → 外に出て確認する必要があった
今日話すこと Q iOS実機でのジオフェンス機能の確認で役立ったこ0 Q AndroidとiOS両方実装したので、各OSの仕様の違いを踏まえて紹介 API iOS17以降で使える新しい方法がありますが、 今回は古くから使えるCLLocationManagerの機能を使った実装となっています
ジオフェンスを使った機能の開発 ( 位置情報の許可を取得する G CLLocationManagerの startMonitoringを呼ぶ S 通知を受け取る delegateを定義する 「常に許可」が必要
ジオフェンスを使った機能の開発 ( 位置情報の許可を取得する G CLLocationManagerの startMonitoringを呼ぶ region = ( :
CLLocationCoordinate2D( : , : ), : , : ) . . ( : region) let self CLCircularRegion center latitude longitude radius identifier startMonitoring for 139.7150326 35.6671881 500 "identifier" locationManager 通知を受け取る delegateを定義する 範囲指定
ジオフェンスを使った機能の開発 ( 位置情報の許可を取得する G CLLocationManagerの startMonitoringを呼ぶ extension func : {
( manager: , region: ) { ( : region) } } AppDelegate CLLocationManagerDelegate CLLocationManager CLRegion locationManager didEnterRegion _ handleGeofenceEnter region 通知を受け取る delegateを定義する
ジオフェンスを使った機能の開発 ( 位置情報の許可を取得する G CLLocationManagerの startMonitoringを呼ぶ S 通知を受け取る delegateを定義する extension
func : { ( manager: , region: ) { ( : region) } } AppDelegate CLLocationManagerDelegate CLLocationManager CLRegion locationManager didEnterRegion _ handleGeofenceEnter region かんたん!
開発時苦労したことが結構ありました
事象その1 : 通知が来ない
事象その1 通知が来ない 実装できた! いざ、ジオフェンスを設置した駅へ! ジオフェンスを設置したはずの範囲に近づいても一向に通知が来ない‥
事象その1 通知が来ない 原因 a 緯度経度の測地系の問P a アプリでは世界測地系を利用しているが、バック エンドから渡される測地系が日本測地系になって い a
決まった方向、距離にずれる 想定した範囲 実際設置された範囲
事象その1 通知が来ない 対処 R 開発用メニューに、地図にジオフェンス範囲を表示 する設定を追2 R 地図上に、ジオフェンスを設置した位置を可視 R どの範囲に設置されているかわかりやすくなる
事象その2 : 再び、通知が来ない
事象その2 再び、通知が来ない 無事ジオフェンス通知が来るようになった。 しかし、ある時からジオフェンスを設置したは ずの範囲に近づいても通知が来ない‥
事象その2 再び、通知が来ない 原因 Q ジオフェンスの設置可能上限の問h Q iOSのジオフェンスの設置上限は、1アプリ20個まD Q 実装して、外に出て確認、 を何度も繰り返しているうちにジオフェンス設置上
限に達してしまっw Q Androidのジオフェンスの設置上限は、1アプリ100 個までだったので油断していた
対処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 再び、通知が来ない
対処2 F 設置しようとした時に、上限に達していたらエラーUIを出す ようにした (設置中のジオフェンスはmonitoredRegionsで取得可能 F Androidは100個までだったので、エラー考慮をしていな かったのですが、後でエラーUIを追加しました CLLocationManager.
: < > monitoredRegions Set CLRegion 事象その2 再び、通知が来ない
事象その3 : 通知が遅れる
事象その3 通知が遅れる 公共交通機関での移動時の利用を想定 固定で300mといった共通範囲で実装していたが、 バスや電車に乗って確認してみると、、 バスでは良い感じだけど電車では遅すぎる…といった 挙動
事象その3 通知が遅れる 原因 c 範囲内に入ったらすぐにジオフェンス通知が来るわけではなく、 何かしらの判定をしてから通知を行っていそe c (今はないが)公式ドキュメントに、 「範囲内に入ってから、20秒同じ位置にいた場合に通知が来る」 という記載があったことがあるらしR
c 移動スピード他、環境によっても通知の受信にばらつきが出そう (地下鉄が遅いのは予想どおり)
事象その3 通知が遅れる 対処 移動手段共通の範囲、を変更し 範囲を設定してもらうような仕様にした
まとめ 通知が来ない ' ジオフェンスを設置した範囲を可視化しよう それでも、通知が来ない ' 開発時は失敗のNotificationを出したり、ジオフェンス上限 エラーを考慮したUIを提供しよう 通知が遅れる '
ジオフェンス通知の遅れを考慮した仕様にしよう
素敵なジオフェンスライフを!