その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

iBeaconに関してAppleの公式ドキュメントに書かれていたこと

"Location and Maps Programming Guide" というCoreLocationとMapKitまわりのApple公式のプログラミングガイドがあり、そこにはiBeaconまわりの情報が詳細に載っているのですが、いつも更新が遅い(もしくは更新されない)印象がある日本語版にも早々にこの更新が反映されています。


位置情報とマッププログラミングガイド


「領域を退出(exit)するときにしばらく時間をおいてからデリゲートメソッドが呼ばれる」とか「境界を連続して横切った際に、iOS側で何度もイベントが発生しないように制御している」といったiBeaconを試した人がよく言及している挙動についてもちゃんとこのドキュメントに明記されていて、有用な情報が多いと感じました。


というわけで以下に「これは」と思った情報を抜粋します。

フレームワーク内で隠蔽されている挙動に関する情報

バックグラウンドでの挙動

アプリケーションが実行していないときに、ある領域の境界線を横切ると、アプリケーションはそのイベントを処理するためにバックグラウンドで起動されます。同様に、イベントが発生したときにアプリケーションが一時停止中の場合、アプリケーションは動作させられて、イベントを処理するために短い時間(約10秒)が割り当てられます。

境界線横断時の緩衝距離について

システムは、境界線に加え、システムで定義された緩衝距離を越えるまで境界線の横断を報告しません。緩衝距離は、ユーザが境界線付近を移動しているときに、システムが大量の進入・退出イベントを立て続けに生成するのを防ぐための値です。

領域通知の条件について

iOSシミュレータまたはデバイスで領域観測コードのテストを行う場合は、領域の境界線が横断されてもすぐには領域イベントが発生しないことがあることを理解しておいてください。不確かな通知が行われるのを避けるために、iOSでは一定のしきい値条件が満たされないと領域通知を行いません。

特に、ユーザの位置が領域の境界線を横断し、この境界線から最小距離だけ離れてから、この位置を少なくとも20秒間保持しないと、通知は報告されません。

この距離のしきい値は、ハードウェアと現在使用可能な位置情報テクノロジーとによって決められています。たとえば、Wi-Fiが無効になっている場合、領域観測の精度は大幅に低下します。しかしながら、テスト目的の場合は、最小距離は約200メートルであると仮定することができます。

実装のヒント

これらのデリゲートメソッド(注:`didEnterRegion:` と `didExitRegion:`)は、ユーザがビーコン領域に対して進入または退出を行うと必ずデフォルトで呼び出されますが、アプリケーションでこの動作をカスタマイズされることがあります。たとえば、ユーザがデバイスのディスプレイをオンにするまで、ユーザのビーコン領域への進入の通知を遅らせる場合があります。これを行うには、ビーコン領域の登録時に、ビーコン領域のnotifyEntryStateOnDisplayプロパティの値をYESに設定(そして領域のnotifyOnEntryプロパティをNOに設定)するだけです。ユーザに通知が何回も送信されるのを防止するには、領域への進入ごとに1回だけ位置に関する通知を配信するようにします。

このビーコンの配列(注:`locationManager:didRangeBeacons:inRegion:` の第2引数に入ってくる配列のこと)は、最も近くにあるビーコンが配列の先頭にあるように、デバイスからの距離によって整列されています。

ビーコンによる距離測定は、Bluetooth Low Energy無線ビーコンの検出に依存しているため、距離測定の結果は、ユーザがデバイスをどのように扱っているのかによって変わります。たとえば、デバイスがユーザのポケットやバッグの中にある場合やユーザがデバイス手の中で持っている場合、またビーコンと結ぶ直線距離の中に視界を遮るものがあるかどうかによって、距離測定の結果は変わってきます。アプリケーションによる距離測定の結果を一定に保つための方法の1つは、アプリケーションがフォアグラウンドある場合は、デバイスがユーザの手の中にある確率が高いため、アプリケーションがフォアグラウンドにある場合にのみビーコンとの距離測定を使用することです。

領域観測を利用したサービスに関する示唆

たとえば、特定のドライクリーニング店に近づいたら、アプリケーションでは、預けていてもう仕上がっている服を受け取るようにユーザに通知することができます。

passbookでクーポン配信、というユースケースは一番よく言われていますが、こういう場所に紐づいたアラートのようなユースケースもおもしろいと思いました。

あるデパートにおける顧客の体験を豊かにするための専用のアプリケーションでは、このデパートのすべてのチェーン店で同じ近接UUIDで観測を行いながら、各店舗をメジャー値とマイナー値によって区別するという使用方法があります。

ユーザがこのデパート位置にある入口の1つに近づくと、アプリケーションがそのことをユーザに通知します。さらにアプリケーションでは、異なるマイナー値を使用して同じ店舗内の別の売り場を区別することが可能で、位置に適したよりきめの細かい情報をユーザに提供できます。

UUID, Major, Minorをひとつのアプリケーションでどう使い分けるか、の一例としてわかりやすい。