MultiPeerConnectivity的使用

  1. 了解: MultiPeerConnectivity
    Multipeer Connectivity Framework是iOS 7 推出的众多新框架的一种,它拓宽了操作系统中应用的范围。其目的是使开发者可以创建通过Wi-Fi或蓝牙在近距离建立连接的应用。是在近距离设备间建立互动,交换数据和其他资源的很好的简单工具。
    有一款iOS 应用 FireChat , 它的特别之处就是在没有互联网的环境下,安装了该应用的用户可以通过蓝牙、WiFi 建立连接直接开聊! 就是基于 **Multipeer Connectivity Framework **开发的! 有兴趣的可以下载看看!
MultiPeerConnectivity的使用_第1张图片
Paste_Image.png

{ImgCap}FireChat {/ImgCap}

  1. 框架
    首先必须在工程中导入MultiPeerConnectivity.framework框架


    MultiPeerConnectivity的使用_第2张图片

    {ImgCap}MultiPeerConnectivity.framework{/ImgCap}

  2. 用MultiPeerConnectivity进行通讯, 如同三次握手的通讯类似, A先放出广播, B用于搜索! B搜到之后, 会向A发送邀请, 建立连接, 当你接受了之后, A会向B发送一个会话(session), 若建立成功则可以互传数据!

一般 MCAdvertiserAssistant 与 MCBrowserViewController 互用,MCNearbyServiceAdvertiser 与 MCNearbyServiceBrowser 互用 , 前一组系统已经封装好的界面, 后边一组与第一组功能相似, 单方法更多, 可以自定义界面! 进行操作性多一些!
MCPeerID 是设置自己的设备名字! MCSession则是最重要的, 传输消息文字, 文件, 图片都要通过它!

  1. MCPeerID 只有这一个方法用于设置设备名称!
    - (instancetype)initWithDisplayName:(NSString*)myDisplayName

  2. MCAdvertiser 用于广播! 这有两个类了!
    5.1 MCNearbyServiceAdvertiser // 需要自己设置
    - (instancetype)initWithPeer: (MCPeerID *)myPeerID discoveryInfo: (NSDictionary *)info serviceType: (NSString *)serviceType
    三个参数
    参数1: 设备名称:(昵称), 参数2: 发现信息:(可以置空!) 参数2: 参照上边设备标示符
    - (void)startAdvertisingPeer; - (void)stopAdvertisingPeer;
    是开始广播和停止广播!

    代理方法 (这个方法重要 ! )
    //处理接收到的邀请
    invitationHandler这个参数是用来处理是否接收请求的, 如下所示
    - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOLaccept, MCSession *session))invitationHandler;
    参数1: 表示 用来接收邀请的advertiser
    参数2: 表示 从哪个peerID过来的邀请
    参数3: 用于表示接收邀请的时候, 接收context ; 没用过!
    参数4: invitationHandler(BOOL, session) 一个block方法,
    invitationHandler(YES, self.session); 表示接收邀请! 并开始建立会话
    invitationHandler(NO, nill);表示拒绝邀请! 当然, 可以在这个方法中设置弹窗用于确定是否接收邀请!!

    - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didNotStartAdvertisingPeer:(NSError *)error; // 用于处理连接错误
    5.2 MCAdvertiserAssistant
    用于初始化广播服务,
    - (instancetype)initWithServiceType:(NSString *)serviceType discoveryInfo:(NSDictionary *)info session:(MCSession *)session
    参数1 : serviceType 一个类型标示符,通过一个小的文本描述为了浏览器能够发现广播者,这个小文本应该是相同的.只用相同的serviceType,才能相互的连接到!
    关于它的名字有两个规则:

    • 必须是1 - 15字符。
    • 只能包含ASCII小写字母,数字和连字符

    参数2 : 可置空 (类似于刚刚接触的时发给对方的消息, 不过没弄明白)
    参数3 : session 一个已经创建好的会话(下边讲到)
    当然, 若用MCAdvertiserAssistant 就相当于调用的系统已经封装好的, 较为方便一些! 唯一就是界面不可定制!
    - (void)start; - (void)stop; // 表示开始广播 和 停止广播
    还有两个 代理 方法
    // An invitation will be presented to the user
    - (void)advertiserAssistantWillPresentInvitation:(MCAdvertiserAssistant *)advertiserAssistant;
    // An invitation was dismissed from screen
    - (void)advertiserAssistantDidDismissInvitation:(MCAdvertiserAssistant *)advertiserAssistant;
    算是两个回调, 用处不大!.

  3. MCBrowser 搜索周围的设备可以发出会话邀请建立连接
    6.1 MCNearbyServiceBrowser
    // 需要自己设置!
    - (instancetype)initWithPeer:(MCPeerID*)myPeerID serviceType:(NSString*)service // 设备名字, 设备识别码!
    - (void)startBrowsingForPeers;// 开始搜索
    - (void)stopBrowsingForPeers; //停止搜索

// 在搜索到周围设备后调用此方法, 邀请相应的设备加入会话!
- (void)invitePeer:(MCPeerID*)peerID toSession:(MCSession*)session withContext:(NSData*)context timeout:(NSTimeInterval)timeout;
参数1: 邀请的peerID 参数2:建立的session 参数3:置空(没搞太明白) 参数4:延迟时间

MCNearbyServiceBrowser的代理方法 ,

// 表示发现了周围的设备, 再次代理方法中处理是否发送会话邀请!
- (void)browser:(MCNearbyServiceBrowser*)browser foundPeer:(MCPeerID*)peerID withDiscoveryInfo:(NSDictionary*)info;
如:
- (void)browser:(MCNearbyServiceBrowser)browser foundPeer:
(MCPeerID
)peerID withDiscoveryInfo:(NSDictionary*)info{
[browser invitePeer: peerID toSession:self.session withContext:nil timeout:30];
}

// 此方法用于对断开连接的设备做处理! 

- (void)browser:(MCNearbyServiceBrowser*)browser lostPeer:(MCPeerID*)peerID
6.2 MCBrowserViewController ---- (系统封装好的视图, 可直接显示周围已广播的设备!)

MultiPeerConnectivity的使用_第3张图片
{ImgCap}MCBrowserViewController{/ImgCap}
代理方法!
方法1: 用于初始化,MCBrowserViewController, 并附上 serviceType 和 session;
// Create a browser view controller with a service type and a session
- (instancetype)initWithServiceType:(NSString *)serviceType session:(MCSession *)session;
两个代理方法, 代表上边MCBrowserViewController 对应的两个按钮! cancel button 和 done button 所执行的方法, 由于 MCBrowserViewController是个ViewController,所以需要 presentViewController, 因而可以在此方法中调用 dismissViewController !!!
- (void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController; // done button
- (void)browserViewControllerWasCancelled:(MCBrowserViewController *)browserViewController; // cancel button

  1. MCSession
    - (instancetype)initWithPeer:(MCPeerID *)myPeerID; // session初始化 Create a session with an MCPeerID for the local peer

    7.1 发送普通数据
    - (BOOL)sendData:(NSData *)data toPeers:(NSArray *)peerIDs withMode:(MCSessionSendDataMode)mode error:(NSError **)error;
    // 参数1: 发送的数据, 要转成data类型!
    // 参数2: 要发给的所在这个会话中的所有Peers! session中有个 NSArray *connectedPeers, 表示
    // 参数3: MCSessionSendDataMode: 是个枚举
    typedefNS_ENUM(NSInteger, MCSessionSendDataMode) {
    MCSessionSendDataReliable, // 保证可靠和按顺序传递
    MCSessionSendDataUnreliable // 立即发送无需排队,没法保证交付
    }
    参数4: 回调的Error 若是没成功, 就返回Error!
    - (void)disconnect; // 断开连接的方法

    - (NSProgress*)sendResourceAtURL:(NSURL*)resourceURL withName:(NSString*)resourceName toPeer:(MCPeerID*)peerID withCompletionHandler:(void(^)(NSError*error))completionHandler; // 用于发送图片或者文件, 用于还可以用 progress来监控传送进度!
    - (NSOutputStream*)startStreamWithName:(NSString*)streamName toPeer:(MCPeerID*)peerID error:(NSError**)error; // 用来传输流 stream

    MCSession的代理方法!
    方法1 :
    - (void)session:(MCSession*)session peer:(MCPeerID*)peerID didChangeState:(MCSessionState)state;
    // 用于检测连接状态, 可以在这根据不同的连接状态来进行判断操作 !

    注: MCSessionState 是个枚举
    typedefNS_ENUM(NSInteger, MCSessionState) {
    MCSessionStateNotConnected, // not in the session
    MCSessionStateConnecting, // connecting to this peer
    MCSessionStateConnected // connected to the session
    }
    方法2:
    - (void)session:(MCSession*)session didReceiveData:(NSData*)data fromPeer:(MCPeerID*)peerID;
    // 用于简单数据从这个方法中进行接收! 可以在这个中对数据做处理 !

    方法3
    - (void)session:(MCSession*)session didReceiveStream:(NSInputStream*)stream withName:(NSString*)streamName fromPeer:(MCPeerID*)peerID;
    // 用于对流 stream 的接收!

    方法4.1:
    - (void)session:(MCSession*)session didStartReceivingResourceWithName:(NSString*)resourceName fromPeer:(MCPeerID*)peerID withProgress:(NSProgress*)progress;
    // 已经开始从远端开始接收文件
    方法4.2:
    - (void)session:(MCSession*)session didFinishReceivingResourceWithName:(NSString*)resourceName fromPeer:(MCPeerID*)peerID atURL:(NSURL*)localURL withError:(NSError*)error
    // 已经完成接收文件

  2. 连接流程图

MultiPeerConnectivity的使用_第4张图片

{ImgCap}连接流程图{/ImgCap}

9.以后还有补充的: 关于传输数据的! (待续)

  • 参考资料:
  • MultipeerConnectivity.framework梳理 (详细, 比较深刻)
  • MultipeerConnectivity 点对点连接
  • iOS7新技术:如何使用Multipeer Connectivity
  • 理解iOS7的Multipeer Connectivity框架 - 第1部分 (超详细解说, 很适合初学者!)
  • 楼上的英文版 -> Understanding Multipeer Connectivity Framework in iOS 7 – Part 1

你可能感兴趣的:(MultiPeerConnectivity的使用)