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
700
実践ジオフェンス 効率的に開発するために
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
23
15k
安全で使いやすいCarPlayアプリの 魅せ方:HIGと実例から学ぶ
navitimejapan
PRO
1
230
見えないユーザの声はログに埋もれている! ~ログから具体的なユーザの体験を数値化した事例紹介~
navitimejapan
PRO
6
3k
ユーザーのためなら 『デザイン』 以外にも手を伸ばせる
navitimejapan
PRO
2
1.5k
フツーのIT女子が、 Engineering Managerになるまで
navitimejapan
PRO
3
360
不確実性に打ち勝つOKR戦略/How to manage uncertainty with OKR strategy
navitimejapan
PRO
4
3.6k
アジャイルを小さいままで 組織に広める 二周目 / Agile Transformation in NAVITIME JAPAN iteration 2
navitimejapan
PRO
4
1.3k
変更障害率0%よりも「継続的な学習と実験」を価値とする 〜障害を「起こってはならないもの」としていた組織がDirtの実施に至るまで〜 / DevOps Transformation in NAVITIME JAPAN
navitimejapan
PRO
7
5.6k
こうしてふりかえりは終わってしまった / A Demise of a retrospective
navitimejapan
PRO
47
31k
Other Decks in Technology
See All in Technology
人と組織に偏重したEMへのアンチテーゼ──なぜ、EMに設計力が必要なのか/An antithesis to the overemphasis of people and organizations in EM
dskst
5
600
OpenAPIから画面生成に挑戦した話
koinunopochi
0
150
トヨタ生産方式(TPS)入門
recruitengineers
PRO
2
200
AIエージェントの開発に必須な「コンテキスト・エンジニアリング」とは何か──プロンプト・エンジニアリングとの違いを手がかりに考える
masayamoriofficial
0
360
Understanding Go GC #coefl_go_jp
bengo4com
0
1.1k
小さなチーム 大きな仕事 - 個人開発でAIをフル活用する
himaratsu
0
120
Amazon Bedrock AgentCore でプロモーション用動画生成エージェントを開発する
nasuvitz
6
420
.NET開発者のためのAzureの概要
tomokusaba
0
230
実践データベース設計 ①データベース設計概論
recruitengineers
PRO
2
200
退屈なことはDevinにやらせよう〜〜Devin APIを使ったVisual Regression Testの自動追加〜
kawamataryo
1
130
AIとTDDによるNext.js「隙間ツール」開発の実践
makotot
5
660
[CVPR2025論文読み会] Linguistics-aware Masked Image Modelingfor Self-supervised Scene Text Recognition
s_aiueo32
0
210
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
5.7k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.6k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.6k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Into the Great Unknown - MozCon
thekraken
40
2k
Building an army of robots
kneath
306
46k
A Modern Web Designer's Workflow
chriscoyier
695
190k
GitHub's CSS Performance
jonrohan
1031
460k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
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を提供しよう 通知が遅れる '
ジオフェンス通知の遅れを考慮した仕様にしよう
素敵なジオフェンスライフを!