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
1k
3
Share
実践ジオフェンス 効率的に開発するために
2024/08/22-24に開催された「iOSDC Japan 2024」で発表した資料です
https://iosdc.jp/2024/
NAVITIME JAPAN
PRO
August 26, 2024
More Decks by NAVITIME JAPAN
See All by NAVITIME JAPAN
つよつよリーダーが 抜けたらどうする? 〜ナビタイムのAgile⽀援組織の変遷〜
navitimejapan
PRO
23
16k
安全で使いやすいCarPlayアプリの 魅せ方:HIGと実例から学ぶ
navitimejapan
PRO
1
270
見えないユーザの声はログに埋もれている! ~ログから具体的なユーザの体験を数値化した事例紹介~
navitimejapan
PRO
6
3.3k
ユーザーのためなら 『デザイン』 以外にも手を伸ばせる
navitimejapan
PRO
2
1.8k
フツーのIT女子が、 Engineering Managerになるまで
navitimejapan
PRO
3
420
不確実性に打ち勝つOKR戦略/How to manage uncertainty with OKR strategy
navitimejapan
PRO
4
3.9k
アジャイルを小さいままで 組織に広める 二周目 / Agile Transformation in NAVITIME JAPAN iteration 2
navitimejapan
PRO
4
1.5k
変更障害率0%よりも「継続的な学習と実験」を価値とする 〜障害を「起こってはならないもの」としていた組織がDirtの実施に至るまで〜 / DevOps Transformation in NAVITIME JAPAN
navitimejapan
PRO
8
6k
こうしてふりかえりは終わってしまった / A Demise of a retrospective
navitimejapan
PRO
47
33k
Other Decks in Technology
See All in Technology
Chasing Real-Time Observability for CRuby
whitegreen
0
120
20260428_Product Management Summit_Loglass_JoeHirose
loglassjoe
0
1.1k
Shipping AI Agents — Lessons from Production
vvatanabe
0
240
20年前の「OSS革命」に学ぶ AI時代の生存戦略
samakada
0
430
こんなアーキテクチャ図はいやだ / Anti-pattern in AWS Architecture Diagrams
naospon
1
450
Microsoft 365 / Microsoft 365 Copilot : 自分の状態を確認する「ラベル」について
taichinakamura
0
230
ARIA Notifyについて
ryokatsuse
1
120
ハーネスエンジニアリングの概要と設計思想
sergicalsix
9
5k
AIはハッカーを減らすのか、増やすのか?──現役ホワイトハッカーから見るAI時代のリアル【MEGU-Meet】
cscengineer
0
160
自分のハンドルは自分で握れ! ― 自分のケイパビリティを増やし、メンバーのケイパビリティ獲得を支援する ― / Take the wheel yourself
takaking22
1
910
[OpsJAWS 40]リリースしたら終わり、じゃなかった。セキュリティ空白期間をAWS Security Agentで埋める
sh_fk2
3
240
レビューしきれない?それは「全て人力でのレビュー」だからではないでしょうか
amixedcolor
0
330
Featured
See All Featured
Designing for Timeless Needs
cassininazir
0
190
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1k
HDC tutorial
michielstock
2
630
Information Architects: The Missing Link in Design Systems
soysaucechin
0
890
Unsuck your backbone
ammeep
672
58k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
770
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.9k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
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を提供しよう 通知が遅れる '
ジオフェンス通知の遅れを考慮した仕様にしよう
素敵なジオフェンスライフを!