鲜为人知的Multipeer Connectivity(部分转载)
来源:互联网 发布:知乎的成本结构 编辑:程序博客网 时间:2024/04/28 10:33
相信大家对AirDrop都比较熟悉,AirDrop不要求两台机器在同一个网络内,不管是在mac笔记本还是iphone,只需要打开AirDrop就可以将文件分享给附近的人。在iOS7中,引入了一个全新的框架——Multipeer Connectivity(多点连接),利用这一框架,即使在没有连接到WiFi或移动网络的情况下,距离较近的Apple设备之间可基于蓝牙和WiFi技术进行近场通信。与AirDrop不同的地方在于,使用该框架需要自己实现设备的交互。
由于前段时间,项目的需要,对Multipeer Connectivity框架进行了研究,利用苹果提供的MultipeerConnectivity.framework框架,进行二次封装,再实现文件发送接受细节,可以满足近距离文件共享的功能。下面对几个典型的方法进行说明,详细的在使用过程中可参考官方的说明文档和demo。
设备之间的通信通过广播(Advertising)和发现(discovering)服务来实现,我们把这些设备称作节点,一个节点有一个唯一标示MCPeerID对象,它的定义如下:
MCPeerID represents a peer in a multipeer session.Peer IDs (MCPeerID) uniquely identify an app running on a device to nearby peers.provide information that identifies the device and its user to other nearby devices.
为了便于大家理解,接下来的内容转载自CocoaChina的一篇文章,写的很不错,链接点击打开链接。
Advertising & Discovering
通信的第一步是让大家互相知道彼此,我们通过广播(Advertising)和发现(discovering)服务来实现。广播作为服务器搜索附近的节点,而节点同时也去搜索附近的广播。在许多情况下,客户端同时广播并发现同一个服务,这将导致一些混乱,尤其是在client-server模式中。所以,每一个服务都应有一个类型(标示符),它是由ASCII字母、数字和“-”组成的短文本串,最多15个字符。通常,一个服务的名字应该由应用程序的名字开始,后边跟“-”和一个独特的描述符号。(作者认为这和 com.apple.*标示符很像),就像下边:
- static NSString * const XXServiceType = @"xx-service";
- MCPeerID *localPeerID = [[MCPeerID alloc] initWithDisplayName:[[UIDevice currentDevice] name]];
Advertising
服务的广播通过MCNearbyServiceAdvertiser来操作,初始化时带着本地节点、服务类型以及任何可与发现该服务的节点进行通信的可选信息。发现信息使用Bonjour TXT records encoded(according to RFC 6763)发送。
- MCNearbyServiceAdvertiser *advertiser =
- [[MCNearbyServiceAdvertiser alloc] initWithPeer:localPeerID
- discoveryInfo:nil
- serviceType:XXServiceType];
- advertiser.delegate = self;
- [advertiser startAdvertisingPeer];
- - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser
- didReceiveInvitationFromPeer:(MCPeerID *)peerID
- withContext:(NSData *)context
- invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler
- {
- if ([self.mutableBlockedPeers containsObject:peerID]) {
- invitationHandler(NO, nil);
- return;
- }
- [[UIActionSheet actionSheetWithTitle:[NSString stringWithFormat:NSLocalizedString(@"Received Invitation from %@", @"Received Invitation from {Peer}"), peerID.displayName]
- cancelButtonTitle:NSLocalizedString(@"Reject", nil)
- destructiveButtonTitle:NSLocalizedString(@"Block", nil)
- otherButtonTitles:@[NSLocalizedString(@"Accept", nil)]
- block:^(UIActionSheet *actionSheet, NSInteger buttonIndex)
- {
- BOOL acceptedInvitation = (buttonIndex == [actionSheet firstOtherButtonIndex]);
- if (buttonIndex == [actionSheet destructiveButtonIndex]) {
- [self.mutableBlockedPeers addObject:peerID];
- }
- MCSession *session = [[MCSession alloc] initWithPeer:localPeerID
- securityIdentity:nil
- encryptionPreference:MCEncryptionNone];
- session.delegate = self;
- invitationHandler(acceptedInvitation, (acceptedInvitation ? session : nil));
- }] showInView:self.view];
- }
在上面的例子中,我们创建了session,并在接受邀请连接时传递到节点。一个MCSession对象跟本地节点标识符、securityIdentity以及encryptionPreference参数一起进行初始化。
- MCSession *session = [[MCSession alloc] initWithPeer:localPeerID
- securityIdentity:nil
- encryptionPreference:MCEncryptionNone];
- session.delegate = self;
MCEncryptionOptional:会话更喜欢使用加密,但会接受未加密的连接。
MCEncryptionRequired:会话需要加密。
MCEncryptionNone:会话不应该加密。
启用加密会显著降低传输速率,所以除非你的应用程序很特别,需要对用户敏感信息的处理,否则建议使用MCEncryptionNone。
MCSessionDelegate协议将会在发送和接受信息的部分被覆盖。
Discovering
客户端使用MCNearbyServiceBrowser来发现广播,它需要local peer标识符,以及非常类似MCNearbyServiceAdvertiser的服务类型来初始化:
- MCNearbyServiceBrowser *browser = [[MCNearbyServiceBrowser alloc] initWithPeer:localPeerID serviceType:XXServiceType];
- browser.delegate = self;
- MCBrowserViewController *browserViewController =
- [[MCBrowserViewController alloc] initWithBrowser:browser
- session:session];
- browserViewController.delegate = self;
- [self presentViewController:browserViewController
- animated:YES
- completion:
- ^{
- [browser startBrowsingForPeers];
- }];
以上是转载的文章,将Multipeer Connectivity框架的设备发现都介绍的很清楚,接下来就是根据业务的需要,发送消息或者文件,在下一张中,我会结合实际项目向大家详细介绍各个代理的使用方法,不得不说这个框架虽然用的人很少,但对我个人而言,这是非常值得研究的,有任何问题欢迎添加我的微信或qq:985517968。
- 鲜为人知的Multipeer Connectivity(部分转载)
- 鲜为人知的Multipeer Connectivity(部分转载)
- Multipeer Connectivity
- 理解iOS7的Multipeer Connectivity框架
- Multipeer Connectivity.Framwork实战
- Multipeer Connectivity Framework
- iOS 7 与 Xamarin - MultiPeer Connectivity(1)
- multipeer connectivity近距离多点通讯
- Multipeer Connectivity (多点连接)网络框架
- 利用Multipeer Connectivity框架进行WiFi传输
- 利用Multipeer Connectivity框架进行WiFi传输
- iOS7新技术:如何使用Multipeer Connectivity
- 转载:鲜为人知的编程真相
- 转载:鲜为人知的编程真相
- iOS 7 与 Xamarin - MultiPeer Connectivity (2)
- iOS7—Day by day—Day23:Multipeer Connectivity
- Streaming Audio to Multiple Listeners via iOS' Multipeer Connectivity
- Understanding Multipeer Connectivity Framework in iOS 7 – Part 1
- 3631:[JLOI2014]松鼠的新家
- 堆的概念及基本操作实现
- 二分查找算法(OC版--非递归实现)
- Bitmap与BiatmapFactory深入解析
- 理解Java虚拟机体系结构
- 鲜为人知的Multipeer Connectivity(部分转载)
- Android酷炫实用的开源框架
- Java 学习系列:LinkedList 的实现原理
- javascript创建子类
- PHP中与Perl兼容的正则表达式处理函数
- nodejs
- mount/umount函数
- global-results定义全局的result不起作用
- iOS添加一个view到所有视图的上面