- 了解: MultiPeerConnectivity
Multipeer Connectivity Framework是iOS 7 推出的众多新框架的一种,它拓宽了操作系统中应用的范围。其目的是使开发者可以创建通过Wi-Fi或蓝牙在近距离建立连接的应用。是在近距离设备间建立互动,交换数据和其他资源的很好的简单工具。
有一款iOS 应用 FireChat , 它的特别之处就是在没有互联网的环境下,安装了该应用的用户可以通过蓝牙、WiFi 建立连接直接开聊! 就是基于 **Multipeer Connectivity Framework **开发的! 有兴趣的可以下载看看!
{ImgCap}FireChat {/ImgCap}
-
框架
首先必须在工程中导入MultiPeerConnectivity.framework框架
{ImgCap}MultiPeerConnectivity.framework{/ImgCap}
- 用MultiPeerConnectivity进行通讯, 如同三次握手的通讯类似, A先放出广播, B用于搜索! B搜到之后, 会向A发送邀请, 建立连接, 当你接受了之后, A会向B发送一个会话(session), 若建立成功则可以互传数据!
一般 MCAdvertiserAssistant 与 MCBrowserViewController 互用,MCNearbyServiceAdvertiser 与 MCNearbyServiceBrowser 互用 , 前一组系统已经封装好的界面, 后边一组与第一组功能相似, 单方法更多, 可以自定义界面! 进行操作性多一些!
MCPeerID 是设置自己的设备名字! MCSession则是最重要的, 传输消息文字, 文件, 图片都要通过它!
MCPeerID 只有这一个方法用于设置设备名称!
- (instancetype)initWithDisplayName:(NSString*)myDisplayName
-
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;
算是两个回调, 用处不大!. 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 ---- (系统封装好的视图, 可直接显示周围已广播的设备!)
代理方法!
方法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
-
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;
// 用来传输流 streamMCSession的代理方法!
方法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
// 已经完成接收文件 连接流程图
{ImgCap}连接流程图{/ImgCap}
9.以后还有补充的: 关于传输数据的! (待续)