Multipeer Connectivityを試してみた
Multipeer Connectivity Framework
Multipeer Connectivityを試してみた
iOS 7に追加されたフレームーワークでWifiやBluetoothを利用した近距離にあるiOS端末間のPeer to Peer 通信を手軽に実現するためのフレームーワークです。
ユースケース
- 文書、写真の共同編集作業
- ファイル共有
- センサーデータの集積
DEMO
Multipeer Connectivity Framework API クラス群
MCPeerID
MCSession
- 複数のピア間の通信を管理
MCAdvertiserAssistant
- ピアを他のピアから存在を発見できるようにする(アドバタイズ)
- 接続要求に対する処理
MCBrowserViewController
- ピアの検索
- ピアのリスト表示
- 接続要求の送信
- 接続の確立
接続方法
接続要求を受け取る準備
- peerIDを作成します
_peerID = [[MCPeerID alloc] initWithDisplayName:@"displayName"];
- セッションを作成します
_session = [[MCSession alloc] initWithPeer:_peerID securityIdentity:nil encryptionPreference:MCEncryptionRequired];
_session.delegate = self;
- ピアを他のピアから存在を発見できるようにします
_advertiserAssistant = [[MCAdvertiserAssistant alloc] initWithServiceType:@"serviceType" discoveryInfo:nil session:_session];
[_advertiserAssistant start];
接続要求を送信する
- MCBrowserViewControllerを作成/表示する
MCBrowserViewController *browserViewController;
browserViewController = [[MCBrowserViewController alloc] initWithServiceType:_serviceType session:_session];
browserViewController.delegate = self;
browserViewController.minimumNumberOfPeers = kMCSessionMinimumNumberOfPeers;
browserViewController.maximumNumberOfPeers = kMCSessionMaximumNumberOfPeers;
[self presentViewController:browserViewController animated:YES completion:nil];
- MCBrowserViewControllerのUI
- MCBrowserViewControllerが表示されると自動的に近くの端末が検出されます、検出された端末をタップすると、接続要求が送信されます。
- 接続要求受信時のキャプチャ
接続状態
ピアの接続状態が変化するとMCSessionのデリゲートメッソドが呼ばれる
-(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
データの送受信
テキストの送信
// Send a data message to a list of destination peers
- (BOOL)sendData:(NSData *)data toPeers:(NSArray *)peerIDs withMode:(MCSessionSendDataMode)mode error:(NSError **)error;
テキストの受信
// テキストを受け取ったとき呼ばれる
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID
リソースの送信
Send a resource (a file or an HTTP document) referenced by an NSURL;
completionHandler is called when the resource is received by the remote
peer or if an error occurred.
- (NSProgress *)sendResourceAtURL:(NSURL *)resourceURL withName:(NSString *)resourceName toPeer:(MCPeerID *)peerID withCompletionHandler:(void(^)(NSError *error))completionHandler;
リソースの受信
- (void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress
-(void)session:(MCSession *)session didFinishReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID atURL:(NSURL *)localURL withError:(NSError *)error
バイトストリームの送信
Opens a byte stream to a nearby peer.
- (NSOutputStream *)startStreamWithName:(NSString *)streamName toPeer:(MCPeerID *)peerID error:(NSError **)error
バイトストリームの受信
Called when a nearby peer opens a byte stream connection to the local peer.
-(void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID
サンプル
More Information
https://developer.apple.com/library/prerelease/ios https://developer.apple.com/library/prerelease/ios/samplecode/MultipeerGroupChat/Introduction/Intro.html#//apple_ref/doc/uid/DTS40013691
参考情報
http://tech.voyagegroup.com/archives/7333988.html http://dev.classmethod.jp/references/ios-multipeer-apiusage/