GameKitを使った
              楽しい



              Bluetoothプログラミング
              @taiko19xx
              on SWWDC 2012/7/21
12年7月23日月曜日
自己紹介


              木村 俊彦(@taiko19xx)
              Webデザイン系学校の学生
              就職先探してます☆
              ぶろぐ http://tnfront.net/




12年7月23日月曜日
自己紹介

              iPhone開発歴 2年ぐらい
              自称ゆるゆる開発者
              アプリ
               BTGPS
               GPS2Photo(New!)




12年7月23日月曜日
今日は入門編です



12年7月23日月曜日
Bluetoothとは

              おなじみの近距離無線通信技術
              iPhone・iPadは全世代、Touchは第二世代から
              省電力
              バージョンやプロファイルが様々
               今回は気にしません




12年7月23日月曜日
iOSのBluetooth通信


              GameKitを使った通信
               主に使われるフレームワーク
               今のところこれしかない?
              CoreBluetooth(Bluetooth 4.0搭載機のみ)




12年7月23日月曜日
GameKitとは

              “ゲーム向け”のフレームワーク
               GameCenter(iOS 4.1∼)
               Peer-to-Peer Connectivity(iPhoneOS 3.0∼)
               In-Game Voice(同上)
              今回はPeer-to-Peer Connectivityのお話




12年7月23日月曜日
Part1.検索と接続



12年7月23日月曜日
検索から接続確立まで
              GKPeerPickerControllerを使う
               検索から接続までやってくれるので楽
               一対一の接続に限る
              GKPeerPickerControllerを使わない
               検索や接続を自前で実装する必要がある
               一対多や”すれちがい通信”ができるようになる
              今回はGKPeerPickerController使います


12年7月23日月曜日
GKPeerPickerController




              UIImagePickerControllerとそっくりです




12年7月23日月曜日
connectionTypesMask

              GKPeerPickerConnectionTypeNearby(Bluetooth)と
              GKPeerPickerConnectionTypeOnline(WiFi)がある
              TypeOnlineは接続処理を自前で実装する必要があ
              る
              TypeOnlineのみの指定はできず、TypeNearbyと
              セットです




12年7月23日月曜日
show
              こんな画面が出てきて探索が始まります




              見つかると一覧が表示されます




12年7月23日月曜日
show
              選択すると、選択された側で許可するかを聞かれ
              ます




12年7月23日月曜日
許可orキャンセル後


              許可すると
              peerPickerController:didConnectPeer:toSession:
              キャンセルするとpeerPickerControllerDidCancel:
              それぞれGKPeerPickerControllerDelegateのメソッ
              ドが呼び出されます




12年7月23日月曜日
GKPeerPickerController
              Delegate 実装



12年7月23日月曜日
peerPickerController:didConnectPeer:t
              oSession:




              currentSession(GKSession)は接続中のセッション
              setDataReceiveHandler:withContextを書かないと
              受信時に何も呼ばれません




12年7月23日月曜日
peerPickerControllerDidCancel:




          最低限、pickerを解放するだけ
          dismissは自動で実行されます




12年7月23日月曜日
Part2.データ送受信



12年7月23日月曜日
送受信まで
              送信
              GKSessionの
              sendDataToAllPeers:withDataMode:error:を呼び
              出す
              受信
              receiveData:fromPeer:inSession:context:が呼び
              出される
              setDataReceiveHandler:withContextを書き忘れ
              ていると呼び出されません


12年7月23日月曜日
sendDataToAllPeers:withDataMode:err
              or




              NSDataにして送ります
              sendData:toPeers:withDataMode:errorを使えば特
              定の接続先に送信できます



12年7月23日月曜日
withDataMode(Data Transmission
              Mode)

              GKSendDataReliable
               大容量データなど確実に送信する必要がある場
               合に使う
              GKSendDataUnreliable
               すぐに到着する必要がある場合に使いますが、
               再送信されません
              あまり気にせずReliableでいいと思います




12年7月23日月曜日
receiveData:fromPeer:inSession:contex
              t




              もちろんNSDataで入ってきます
              このメソッド内で非常に長い処理をするべきでは
              ない(らしい)




12年7月23日月曜日
送受信はこれだけ!



12年7月23日月曜日
切断



              disconnectFromAllPeers
                すべての接続先から切断
              disconnectPeerFromAllPeers:で特定の接続先から
              切断できます




12年7月23日月曜日
Part3.GKSessionDelegate




12年7月23日月曜日
GKSessionDelegate

              session:peer:didChangeState
              session:didReceiveConnectionRequestFromPeer
              session:connectionWithPeerFailed:withError:
              session:didFailWithError
              接続状態の判定やリクエストの許可不許可、エ
              ラー処理ができます




12年7月23日月曜日
session:peer:didChangeState:




              繋がったり切れたりと、状態が変化すると呼び出
              されます

12年7月23日月曜日
GKPeerConnectionState

              GKPeerStateAvailable(接続が使用可能)
              GKPeerStateUnavailable(接続が使用不可能)
              GKPeerStateConnected(接続した)
              GKPeerStateDisconnected(切断した)
              GKPeerStateConnecting(接続中)
              それぞれ変化した時に呼ばれます



12年7月23日月曜日
session:didReceiveConnectionRequest
              FromPeer:




              接続リクエストがあった時に呼ばれます
              許可するならGKSessionの
              acceptConnectionFromPeer:error:を、許可しない
              ならdenyConnectionFromPeer:を呼び出します




12年7月23日月曜日
connectionErrorFailed&didFailWithError




              接続先との通信に失敗した時など、接続・通信エ
              ラーが発生すると呼ばれます




12年7月23日月曜日
まとめ


              結構簡単にできたと思います(当社比)
              応用すれば何でも送信できると思います
              是非チャレンジしてみてください!




12年7月23日月曜日
参考資料
              GameKit プログラミングガイド

                https://developer.apple.com/jp/devcenter/ios/library/documentation/
                GameKit_Guide.pdf

              【iOS4】初めてのBluetoothプログラミング - おいしいCocoaの飲み方

                http://ip7.biz/wordpress/?p=260

              Cocoaの日々: [iOS] GameKit - Bluetoothを使った iOSデバイス間の通信

                http://cocoadays.blogspot.jp/2010/12/gamekit-bluetooth-ios.html

              iPhone Bluetoothプログラミング / DevX - インターネットコム コラム

                http://japan.internet.com/column/developer/20100216/26.html


12年7月23日月曜日

GameKitを使ったBluetoothプログラミング

  • 1.
    GameKitを使った 楽しい Bluetoothプログラミング @taiko19xx on SWWDC 2012/7/21 12年7月23日月曜日
  • 2.
    自己紹介 木村 俊彦(@taiko19xx) Webデザイン系学校の学生 就職先探してます☆ ぶろぐ http://tnfront.net/ 12年7月23日月曜日
  • 3.
    自己紹介 iPhone開発歴 2年ぐらい 自称ゆるゆる開発者 アプリ BTGPS GPS2Photo(New!) 12年7月23日月曜日
  • 4.
  • 5.
    Bluetoothとは おなじみの近距離無線通信技術 iPhone・iPadは全世代、Touchは第二世代から 省電力 バージョンやプロファイルが様々 今回は気にしません 12年7月23日月曜日
  • 6.
    iOSのBluetooth通信 GameKitを使った通信 主に使われるフレームワーク 今のところこれしかない? CoreBluetooth(Bluetooth 4.0搭載機のみ) 12年7月23日月曜日
  • 7.
    GameKitとは “ゲーム向け”のフレームワーク GameCenter(iOS 4.1∼) Peer-to-Peer Connectivity(iPhoneOS 3.0∼) In-Game Voice(同上) 今回はPeer-to-Peer Connectivityのお話 12年7月23日月曜日
  • 8.
  • 9.
    検索から接続確立まで GKPeerPickerControllerを使う 検索から接続までやってくれるので楽 一対一の接続に限る GKPeerPickerControllerを使わない 検索や接続を自前で実装する必要がある 一対多や”すれちがい通信”ができるようになる 今回はGKPeerPickerController使います 12年7月23日月曜日
  • 10.
    GKPeerPickerController UIImagePickerControllerとそっくりです 12年7月23日月曜日
  • 11.
    connectionTypesMask GKPeerPickerConnectionTypeNearby(Bluetooth)と GKPeerPickerConnectionTypeOnline(WiFi)がある TypeOnlineは接続処理を自前で実装する必要があ る TypeOnlineのみの指定はできず、TypeNearbyと セットです 12年7月23日月曜日
  • 12.
    show こんな画面が出てきて探索が始まります 見つかると一覧が表示されます 12年7月23日月曜日
  • 13.
    show 選択すると、選択された側で許可するかを聞かれ ます 12年7月23日月曜日
  • 14.
    許可orキャンセル後 許可すると peerPickerController:didConnectPeer:toSession: キャンセルするとpeerPickerControllerDidCancel: それぞれGKPeerPickerControllerDelegateのメソッ ドが呼び出されます 12年7月23日月曜日
  • 15.
    GKPeerPickerController Delegate 実装 12年7月23日月曜日
  • 16.
    peerPickerController:didConnectPeer:t oSession: currentSession(GKSession)は接続中のセッション setDataReceiveHandler:withContextを書かないと 受信時に何も呼ばれません 12年7月23日月曜日
  • 17.
    peerPickerControllerDidCancel: 最低限、pickerを解放するだけ dismissは自動で実行されます 12年7月23日月曜日
  • 18.
  • 19.
    送受信まで 送信 GKSessionの sendDataToAllPeers:withDataMode:error:を呼び 出す 受信 receiveData:fromPeer:inSession:context:が呼び 出される setDataReceiveHandler:withContextを書き忘れ ていると呼び出されません 12年7月23日月曜日
  • 20.
    sendDataToAllPeers:withDataMode:err or NSDataにして送ります sendData:toPeers:withDataMode:errorを使えば特 定の接続先に送信できます 12年7月23日月曜日
  • 21.
    withDataMode(Data Transmission Mode) GKSendDataReliable 大容量データなど確実に送信する必要がある場 合に使う GKSendDataUnreliable すぐに到着する必要がある場合に使いますが、 再送信されません あまり気にせずReliableでいいと思います 12年7月23日月曜日
  • 22.
    receiveData:fromPeer:inSession:contex t もちろんNSDataで入ってきます このメソッド内で非常に長い処理をするべきでは ない(らしい) 12年7月23日月曜日
  • 23.
  • 24.
    切断 disconnectFromAllPeers すべての接続先から切断 disconnectPeerFromAllPeers:で特定の接続先から 切断できます 12年7月23日月曜日
  • 25.
  • 26.
    GKSessionDelegate session:peer:didChangeState session:didReceiveConnectionRequestFromPeer session:connectionWithPeerFailed:withError: session:didFailWithError 接続状態の判定やリクエストの許可不許可、エ ラー処理ができます 12年7月23日月曜日
  • 27.
    session:peer:didChangeState: 繋がったり切れたりと、状態が変化すると呼び出 されます 12年7月23日月曜日
  • 28.
    GKPeerConnectionState GKPeerStateAvailable(接続が使用可能) GKPeerStateUnavailable(接続が使用不可能) GKPeerStateConnected(接続した) GKPeerStateDisconnected(切断した) GKPeerStateConnecting(接続中) それぞれ変化した時に呼ばれます 12年7月23日月曜日
  • 29.
    session:didReceiveConnectionRequest FromPeer: 接続リクエストがあった時に呼ばれます 許可するならGKSessionの acceptConnectionFromPeer:error:を、許可しない ならdenyConnectionFromPeer:を呼び出します 12年7月23日月曜日
  • 30.
    connectionErrorFailed&didFailWithError 接続先との通信に失敗した時など、接続・通信エ ラーが発生すると呼ばれます 12年7月23日月曜日
  • 31.
    まとめ 結構簡単にできたと思います(当社比) 応用すれば何でも送信できると思います 是非チャレンジしてみてください! 12年7月23日月曜日
  • 32.
    参考資料 GameKit プログラミングガイド https://developer.apple.com/jp/devcenter/ios/library/documentation/ GameKit_Guide.pdf 【iOS4】初めてのBluetoothプログラミング - おいしいCocoaの飲み方 http://ip7.biz/wordpress/?p=260 Cocoaの日々: [iOS] GameKit - Bluetoothを使った iOSデバイス間の通信 http://cocoadays.blogspot.jp/2010/12/gamekit-bluetooth-ios.html iPhone Bluetoothプログラミング / DevX - インターネットコム コラム http://japan.internet.com/column/developer/20100216/26.html 12年7月23日月曜日