BETA

iOS13.5ではサードパーティアプリから接触確認アプリのBLEを検出することができない

投稿日:2020-07-13
最終更新:2020-07-13

M5 Atomを使用して周囲の接触確認アプリの数を検出するコードを参考に、iOSでもCore Bluetoothフレームワークを使用すれば同等のことができると思い挑戦してみましたが、どうもiOS13.5を搭載した端末ではサードパーティのアプリが接触確認アプリの使用するService UUIDを検出することができないように制限されているようです。

接触確認アプリ(のコアであるExposure Notificationフレームワーク)は、BLEを使用して周囲の端末に追跡用の識別子を送信することで利用者と濃厚接触した方を記録します。その際に特定のService UUIDを使用しているため、周囲のBLEをスキャンしてService UUIDでフィルタリングを行えば接触確認アプリのおおよその稼働数を推測できます。先程のコードでも同様の仕組みになっていました。

Exoisure Notificationフレームワークが使用するService UUIDは、Appleの公開しているBluetooth仕様書にFD6Fであることが記載されています。
Exposure Notification - Bluetooth Specification

iOSでは以下のようなコードで周囲のBLEをスキャンすることができます。

import CoreBluetooth  

var centralManager = CBCentralManager(delegate: self, queue: nil, options: nil)  

func centralManagerDidUpdateState(_ central: CBCentralManager) {  
    if central.state == .poweredOn {  
        centralManager.scanForPeripherals(withServices: nil, options: nil)  
    }  
}  

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {  
    print(advertisementData)  
}  

周囲にあるBLEが検出されるとcentralManager:didDiscover:advertisementData:が呼ばれ、Service UUIDなどの情報はadvertisementDataパラメーターから参照することができます。

別の端末で接触確認アプリを稼働させた状態で、このコードを実行してみます。
iOS13.4の場合は以下のような値を取得できました。

[  
 "kCBAdvDataTimestamp": 616293108.586259,   
 "kCBAdvDataIsConnectable": 0,   
 "kCBAdvDataRxPrimaryPHY": 0,   
 "kCBAdvDataRxSecondaryPHY": 0,   
 "kCBAdvDataServiceUUIDs": <__NSArrayM 0x28212b2d0>(  
   FD6F  
 ),   
 "kCBAdvDataServiceData": {  
   FD6F = {length = 20, bytes = 0x30e2ca07695fd584138a038716cd584e0c7d1999};  
 }  
]  

しかし、iOS13.5の場合は以下のような値しか取得できませんでした。

[  
 "kCBAdvDataTimestamp": 616293092.37413,   
 "kCBAdvDataIsConnectable": 0,   
 "kCBAdvDataRxPrimaryPHY": 1,   
 "kCBAdvDataRxSecondaryPHY": 0,   
 "kCBAdvDataServiceUUIDs": <__NSArrayM 0x28366d890>(  

 )  
]  

取得結果を比較すると、本来はFD6Fが格納されているはずのService UUIDは空となっています。

Apple Developer Forumやそこから参照されているブログを見ると、iOS13.5以降ではOS側でブロックされているようです。また、AppStoreで公開されているBLEスキャナーアプリをいくつか試してみましたが、同様にiOS13.5以降ではService UUIDを取得することができていませんでした。

もしも周囲の接触確認アプリの稼働状況を確認したい場合は、iOS13.4以前を用意するかiOS以外の機器を使用する必要がありそうです。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

⭐オススメ技術ブログ⭐

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう