Site cover image

ふつうのITエンジニアの独り言

本業はAndroidとiPhoneのアプリ開発のエンジニアです。将来はフリーランスで海の近くで妻とのんびり暮らすことを夢見て、幅広くIT技術に触れていきたいと思います。このブログはその備忘録と私のポートフォリオとして活動記録を記すものです。

XcodeのiPhoneシミュレータでCoreBluetoothを使いたい(その1)

目次


はじめに


 私は普段AndroidとiPhoneのアプリ開発でBluetooth(特にLow Energy)を扱う仕事をしています。Bluetoothで機器とペアリングして機器から返ってくる情報を分析してアプリに表示します。しかし、アプリ開発をしていると何かとAndroidやiPhoneの実端末が必要になります。それは、Android StudioやXCodeが提供する端末シミュレータがBluetoothに対応していないことが原因です。シミュレータ上で開発PCのBluetoothを利用できれば、アプリの一連の動作確認をシミュレータ上で完結でき、必要な端末数も減らせるはずです。
 なぜ、AppleやGoogleがシミュレータでBluetoothをサポートしようとしないのか疑問に思うところですが、ここに一定の需要があるはず(少なくとも私は欲しい)なので、まずはMac上のiPhoneのシミュレータでBluetoothを利用する方法を考えます。iPhoneでダメならMac上のAndroidシミュレータはなおさら無理なので、iPhoneを優先しています。

実開発における実態調査


 検討を始めるにあたって、おそらく同じ悩みを抱えている人たちが試行錯誤しているはずなので、Webで調査を行います。すでに実用的な方法が確立されているのであれば、その手段を採用すれば良いだけなので、本ブログはその紹介でオシマイになります。

方法その1. BLEドングルを利用する

 iOSシミュレータでCore Bluetoothアプリケーションをテストする方法が紹介されていました。しかし、この情報はiOS5の時代のもので10年以上前になります。

 このBluetoothドングルを使った方法が今でも使用できるのか調査したところ、iOS7以降ではBLEがサポートされていないようです。

方法その2. CoreBluetoothのモックライブラリ

 Nordicから というライブラリが公開されていました。これは、iPhoneシミュレータ上でBluetooth通信をモックでテストすることができるライブラリです。CoreBluetoothMockのReadmeによると、実際のBLEデバイスが開発中であってもUIのテストを実施することができるということです。なお、Swiftでのみ利用可能で、Objective-Cを利用する場合は の利用を推奨しています。

 これらの説明を読む限りだと、モック側の開発が必要になりそうです。デバイスが開発中の場合においては有効ですが、すでにデバイスが用意されており、かつデバイスの動作が複雑でモック化が困難な場合においては有効な手段にはなり得ないと思います。

 今回、私が実現したいのは後者のケースでのシミュレータでのBluetooth利用なので、この方法も使えません。

調査結果の結論

 調査を進めてみましたが、他に有益な情報は見つかりませんでした。つまり、iPhone開発においで、シミュレータ上でBluetoothを使う方法は確立されておらず、ほとんどの場合において実機での開発が行われていることがわかりました。しかし、調査の中でBluetoothを利用したいという要求があることも分かりました。

シミュレータでのBluetooth利用検討


シミュレータの仕様確認

 ここからは、調査も踏まえたシミュレータでのBluetooth利用に関する実現方法を私なりに検討してみます。検討にあたって、iPhoneシミュレータで利用できる機能と利用できない機能を整理します。

通信機能 利用可否 備考
Wi-Fi通信 通常のネットワーク通信はMacのネットワークを使って可能。API通信などのテストに使える。
ローカルネットワーク通信 BonjourやローカルIP通信が可能。
位置情報のシミュレーション 任意の位置を設定してGPS機能を模倣できる。ルートのシミュレーションも可能
Apple Payのシミュレーション UIやフローの確認は可能。ただし、実際の支払い処理は不可。
SMS/電話のシミュレーション 通知やUIの挙動確認が可能。実際の送受信は不可。
通知(Push Notification) ローカル通知は可能。Push通知はテスト用トークンを使って一部確認可能。
アクセシビリティ(VoiceOverなど) Accessibility Inspectorで要素の確認は可能。ただし、音声読み上げは不可
Bluetooth通信(CoreBluetooth) × シミュレータではBLE通信は非対応。実機でのみ確認可能
NFC通信 × NFCタグの読み取りや書き込みは実機のみ対応。
セルラー通信(4G/5G) × シミュレータはMacのネットワークを使うため、キャリア通信の挙動は確認不可。
カメラ・マイク × UIの確認は可能だが、実際の撮影・録音は不可。
Face ID / Touch ID × UIの確認は可能だが、認証処理は不可。

 今回の件には関係ないですが、調べてみて意外だったのは位置情報のシミュレーションができることでした。GPSを使ったアプリを作ったことがないので考えたこともなかったです。さて、利用可否の対応状況を確認すると、通信に関してはWi-Fiとローカル通信以外は全て利用できないようです。逆にいうと、Wi-Fiやローカル通信を使ってBluetooth通信を活用利用する手段があるかも・・・ということです。

ローカル通信を活用したBluetooth通信

 ローカル通信は、LANやWi-Fiを使って同じネットワーク内のデバイス同士で行う通信のことを言います。なので、先ほどの仕様整理においては、厳密にはWi-Fi通信にはローカル通信も含まれているということです。ローカル通信を使ってBluetooth通信を実現する方法を提案したいと思います。

案その1. 実機iPhoneのCoreBluetoothを共有する

 本物のiPhoneが使っているCoreBluetoothの機能をシミュレータから利用するシステム案です。複数のデベロッパーが同一のローカルネットにいる場合においてのみ利用可能です。

graph TD
	
  sim1(シミュレータ1) --ローカル通信--> iPhone
  sim2(シミュレータ2) --ローカル通信--> iPhone
  simN(シミュレータN) --ローカル通信--> iPhone
  
  subgraph Mac1[Mac 1]
	  sim1
  end
  
  subgraph Mac2[Mac 2]
	  sim2
  end
  
  subgraph MacN[Mac 3]
	  simN
  end
  
  subgraph iPhone[iPhone実機]
		server(server) <--> cb(CoreBluetooth)
  end
  
  subgraph ローカルネットワーク
	  Mac1
	  Mac2
	  MacN
	  iPhone
  end

 この構成のメリット・デメリットは、以下が考えられます。

メリット
  • iPhoneが一台あれば複数人で共用することが可能にあること
  • iPhoneが提供する本物のCoreBluetoothの機能を利用することができる。

デメリット

  • 全員が同じローカルネットワーク下にいる必要がある。
  • ペアリング時の画面操作を手動で行う、もしくは自動化する方法が別途必要になる。

 小さい開発であればデメリットの影響は受けないかもしれませんが、昨今のリモートワークが進む環境においては、全員が同じ場所で開発するということは中々むずかしいかもしれません。あと、もしかするとVPN技術を利用することで、仮想的に同一のローカルネットワークとして扱うことも可能かもしれません。

案その2. MacのCoreBluetoothを共有する

 実機iPhoneのCoreBluetoothを利用するほどでもない場合においては、こちらの方が有効かもしれません。それは、各開発者のMacのCoreBluetoothを自端末内で閉じたローカルネットワーク(172.0.0.1)で共有する方法です。

graph TD
	sim(シミュレータ)
	server(server)
	cb(CoreBluetooth)

	subgraph local[172.0.0.1]
		sim --> server
		server --> cb
	end

	subgraph Mac[Mac]
		local
	end

 この構成のメリット・デメリットは、以下が考えられます。

メリット
  • 開発者のMac毎にCoreBluetoothが利用できるため、同じ場所にいる必要はない。
  • ペアリング時の操作を各自のMacで行える。

デメリット

  • MacのCoreBluetoohと、iPhoneのCoreBluetoothで動作が異なる場合がある。

 シミュレータ環境で行いたいことが、UI開発などのBluetoothと直接関係がない部分の開発で、BluetoothはUIを更新するために必要な手段でしかない場合においては、デメリットは関係がないはずです。

Serverの実現方法

 これらのシステム構成のキモとなる部分はCoreBluetoothをブリッジするサーバにあります。サーバではiPhoneおよびMacのCoreBluetooth機能を実行して結果を返すAPIを提供することになりますが、これ自体の実現はさほど難しくはありません。

 難しいのは、CoreBluetoothのAPIをそっくりそのままコピーすることにあります。CoreBluetoothの仕様を熟知していないとできないので、この点をクリアできれば実現の見込みはあると思います。

まとめ


 CoreBluetoothをiPhoneシミュレータで利用するための方法について調査と検討を行いました。困っている人は多いが、その現実的な解決方法が提案されていない現状に驚きつつ、CoreBluetoothをローカル通信で共有する案を提案しました。

 今後は、この案を具体化するための設計を行なっていきたいと思います。