ヘッダー画像

iOS と Android のジオフェンス

ある領域に近づいた時や離れた時のイベントを取得したいというケースに使えるのがジオフェンスです。Beacon の GPS 版って考えるとイメージしやすいかもしれませんね。

iOS にも CoreLocation を用いることでジオフェンスが設定できます。ただ、iOS と Android では設定次第で挙動が異なります。

iOS のジオフェンス

iOS では設定した領域にすでに居たり、出ていたりした場合、ジオフェンスを開始した時点で「領域内に入りました〜」や「領域外に出ました〜」のようにイベントが発生することはありません。つまり、すでに領域内に居る場合は一旦、領域外に出ない限りイベントが発生しないです。

Android のジオフェンス

逆に Android のジオフェンスはどうなってるかというと、こちらは設定するフラグで挙動が変化します。その設定するフラグというのが以下3つです。

INITIAL_TRIGGER_DWELL
INITIAL_TRIGGER_ENTER
INITIAL_TRIGGER_EXIT​

INITIAL_TRIGGER_DWELL :「ジオフェンスが追加されたとき、およびデバイスがしばらくそのジオフェンス内に既にある場合」

INITIAL_TRIGGER_ENTER :「ジオフェンスが追加されたとき、およびデバイスがすでにそのジオフェンス内にある場合」

INITIAL_TRIGGER_EXIT :「ジオフェンスが追加されたとき、およびデバイスがすでにそのジオフェンスの外側にある場合」

フラグの設定の仕方はジオフェンスの領域を定義し、追加するときに以下のうように設定します。

GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
builder.setInitialTrigger(ここに上記3つのフラグの設定);

どのフラグもジオフェンス開始時に既に領域内、領域外にいるときにもイベントが発生してしまいます。INITIAL_TRIGGER_DWELL に関してはしばらく領域内外に滞在しているとイベント発生するものですが、確実に対処できる方法ではありません。

解決方法

では、Android でのジオフェンス開始時点のイベント発生を回避するにはどうすればいいかというと、設定するフラグを 0に設定することで回避可能でした。

GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
builder.setInitialTrigger(0);

まとめ

iOS と Android でのジオフェンスの挙動についてですが、最大領域設定数など細かい差異はありますが、設定次第では概ね同じような挙動を得られると思います。

参考

Stop initial triggering if device is already inside Geofence android

この記事が気に入ったらサポートをしてみませんか?