南東京iPhone開発者勉強会で話した際の資料です。
すれ違い通信アプリ『EncountMe』の開発を通して得た
iPhoneのBluetoothまわりの諸々について、まとめています。
アジェンダだけ抜粋すると
- Bluetoothを利用するメリット(EncountMeでBTを選んだ理由)
- 実装方法
- GKPeerPickerControllerを使う場合
- GKPeerPickerControllerを使わない場合
- できること/できないこと
- ユーザー操作なしでの接続確立
- 複数ピアとの同時接続
- アプリ内でのOn/Of
- AndroidとのBluetooth通信
- 注意点
- Wi-Fiとの干渉
といった内容になっております。
※間違い、勘違いを含んでいる可能性が多分にありますので、
お気づきの点などあればご指摘いただけると幸いです。
(3/4追記)
@cutmailさんがメモしてくださっていました。
http://d.hatena.ne.jp/invent/20110220/1298218794
スライドみるのが面倒な方はこちらをどうぞ。
- EncountMe
- すれ違い通信アプリ
- Bluetoothと位置情報を使用
- Bluetoothを利用するメリット
- 省電力
- オフラインで利用可能
- サーバーサイド不要(P2Pなので)
- ちょうどすれ違い的な範囲(10mちょっと)
- GKPeerPickerControllerを使う場合
- GameKitフレームワークをプロジェクトに追加
- 使わない場合
- できること/できないこと1
- ユーザー操作なしで接続確立
- Pickerを使用すると、接続確立時にユーザーにOK/NGを選んでもらう必要がある。
- できること/できないこと2
- どっかのピアと接続した状態で新しいのが繋がるか
- 複数ピアとの同時接続
- 最大16人まで?ピアモードでは無関係?未検証
- できる
- できること/できないこと3
- アプリ内でのON/OFF
- できない
- ピッカーは使える
- 非公開API
- BluetoothManager.framework
- デバイスonnいしてもらうまでピッカーを使用して、そのあとGKSessionだけ使用ってのはできない
- peesWithConnectionsStateをポーリングして、「状態変化が起きているか」は調べられる
- ただoffだから起きないのか周りいに接続相手がいないからかはわからない
- Notification
- BluetoothAvailabilityChangedNotification
- on/off検知には使えない
- BluetoothPowerChangedNotification
- on/offが切り替わったタイミングで飛んでくる
- もしかしたらon/off検知はできるかも
- session.didFailWithError:でエラー出てるっぽい
- wifi/bluetoothが両方offだった場合に、30509エラーがでてる
- AndroidとのBluetooth通信
- できない
- iPhone側がGameKit同士でしか接続できないため
- Wi-Fiとの干渉
- 問題:BTを使用しているとWi-Fiの速度が遅くなる
- 原因:GameKitがWi-Fiを使用している(両方が有効な場合、フレームワークが勝手にWi-FiかBTかを選ぶ)
- 対策:Wi-Fi接続時にはGKSessionを無効に(available=NO)する
- GKSessionインスタンスを使い回す場合
- そもそもGKSessionインスタンスを作りなおせば問題ない
- まとめ
- ユーザーにはバッテリーを喰うと思われている
- アプリからon/offする手段がない
- on/off検知できない
- Androidと接続できない