iPhoneアプリと外部アクセサリの通信方法に関するまとめ

iPhoneアプリを使って、外部アクセサリ(Bluetooth機器など)と通信する方法を調べた結果をメモしておく。

なお、調査には以下のページを参照。
  >>  iPhone Application Programming Guide: Device Support - Communicating with External Accessories

基本事項


iPhoneアプリにて外部アクセサリと通信するためには、External Accessoryフレームワーク(ExternalAccessory.framework) を使用する。(iPhoneOS 3.0以降)

アクセサリとの通信はデータ通信用のプロトコルを使用する。
アクセサリは少なくとも1つのプロトコルをサポートしているが、サポートするプロトコルはベンダ独自で決定することができるため、必ずしも標準コマンドがサポートされている訳ではない。(ベンダ独自でプロトコルを作ることが出来る)

アプリがアクセサリと通信を行う際は、EASessionクラスのインスタンスを生成し、アクセサリがサポートしているプロトコルを指定しセッションをオープンする。
※プロトコル名の記法は、reverse-DNS stringとなっている。(例:com.myDomain.myProtocol)

セッションオープン後、アプリとアクセサリ間の通信はストリームデータを送受信することで行う。
そのため、アプリ開発社は指定したプロトコルのバイナリデータの仕様を理解しておく必要がある。(ここの実装が大変そう。。。)

アプリがサポートするプロトコルの宣言


アプリがサポートしているプロトコルは、Info.plistに宣言する必要がある。
iPhoneOSはInfo.plistの宣言を元に、接続されたアクセサリに対応するアプリを認識する。
アクセサリ接続時、iPhoneOSは対応するアプリを起動する。(らしい)
接続されたアクセサリに対応するアプリが存在しない場合は、App Storeを起動する(可能性あり)。

上記の記述には少し自信がないが、原文を読む限りそういう動作をするみたい。

Declaring the Protocols Your Application Supports

Applications that are able to communicate with an external accessory should declare the protocols they support in their Info.plist file.
Declaring support for specific protocols lets the system know that your application can be launched when that accessory is connected.
If no application supports the connected accessory, the system may choose to launch the App Store and point out applications that do.

実行中にアクセサリとセッションを張る方法


iPhoneOSに接続され使用可能な状態になるまで、External Accessoryフレームワークからアクセサリは使用できない。
アクセサリが使用可能な状態になると、アプリは所定のアクセサリオブジェクトを取得し、セッションをオープンすることで通信できるようになる。

その方法は、原文で説明されているので割愛。

イベントの監視(接続/切断)


External Accessory フレームワークからアクセサリの接続/切断のイベント通知を受け取ることは可能。
ただし、デフォルトでは通知してくれないため、EAAccessoryManagerクラスのregisterForLocalNotifications:メソッドをコールする必要あり。

アクセサリが接続(+認証)されると、notificationとしてEAAccessoryDidConnectNotificationがフレームワークから通知される。
また、切断されるとEAAccessoryDidDisconnectNotificationが通知される。

notificationの他にDelegateを使用してアクセサリの切断を監視する方法もある。

EAAccessoryのサブクラスを作り、そのクラスにEAAccessoryDelegateプロトコルを割り当てる。
アクセサリ切断時にはaccessoryDidDisconnect: メソッドがコールされる。