Multipeer Connectivityを試してみた

Multipeer Connectivity Framework

Multipeer Connectivityを試してみた


iOS 7に追加されたフレームーワークでWifiBluetoothを利用した近距離にあるiOS端末間のPeer to Peer 通信を手軽に実現するためのフレームーワークです。


ユースケース

  • 文書、写真の共同編集作業
  • ファイル共有
  • センサーデータの集積

DEMO

Multipeer Connectivity Framework API クラス群

MCPeerID

MCSession

  • 複数のピア間の通信を管理

MCAdvertiserAssistant

  • ピアを他のピアから存在を発見できるようにする(アドバタイズ)
  • 接続要求に対する処理

MCBrowserViewController

  • ピアの検索
  • ピアのリスト表示
  • 接続要求の送信
  • 接続の確立

接続方法

接続要求を受け取る準備

  1. peerIDを作成します

_peerID = [[MCPeerID alloc] initWithDisplayName:@"displayName"];

  1. セッションを作成します

_session = [[MCSession alloc] initWithPeer:_peerID securityIdentity:nil encryptionPreference:MCEncryptionRequired];
_session.delegate = self;

  1. ピアを他のピアから存在を発見できるようにします

_advertiserAssistant = [[MCAdvertiserAssistant alloc] initWithServiceType:@"serviceType" discoveryInfo:nil session:_session];
[_advertiserAssistant start];

接続要求を送信する

  1. 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
  1. 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/