Multipeer Connectivity 近场多点通信(一)

3,833 阅读7分钟

往期文章

寻找IOS相册中相似图片
NSNotification与类对象,实例对象
CocoaPods私有源搭建
雷达扩散效果搜索设备
IPA下载工具原理解析

简介

支持点对点连接和附近设备的发现。

Multipeer Connectivity 框架支持发现附近设备提供的服务,并支持通过基于消息的数据、流数据和资源(例如文件)与这些服务进行通信。在 iOS 中,该框架使用基础设施 Wi-Fi 网络、点对点 Wi-Fi 和蓝牙个人区域网络进行底层传输。在 macOS 和 tvOS 中,它使用基础设施 Wi-Fi、点对点 Wi-Fi 和以太网。

主要交互对象

使用 Multipeer Connectivity 框架时,您的应用程序必须与多种类型的对象进行交互:

  • 对等点ID对象,代表多点会话中的一个点。保存着设备在近场服务中的唯一ID

  • 会话对象 (MCSession) 支持连接的对等设备之间的通信。您的应用程序创建一个会话,并在对等方接受连接邀请时向其中添加对等方,并在其他对等方邀请连接时创建一个会话。会话对象维护一组表示连接到会话的对等方的对等 ID 对象。

  • 广告商对象 (MCNearbyServiceAdvertiser) 告诉附近的同行您的应用愿意加入指定类型的会话。广告商对象使用单个本地对等对象向附近的其他设备提供标识设备及其用户的信息。

  • 广告商助理对象 (MCAdvertiserAssistant) 提供与广告商对象相同的功能,但还提供允许用户接受邀请的标准用户界面。如果您希望提供自己的用户界面,或者希望对显示的邀请进行额外的编程控制,请直接使用广告商对象。

  • 浏览器对象 (MCNearbyServiceBrowser) 允许您的应用程序通过支持特定类型会话的应用程序以编程方式搜索附近的设备。

  • 浏览器视图控制器对象 (MCBrowserViewController) 提供了一个标准的用户界面,允许用户选择附近的对等点来添加到会话中。

image.png

主要功能模块介绍

各个功能对应如下

image.png

MCPeerID

MCPeerID 对象代表多点会话中的一个点。

您创建一个对等 ID 对象,代表在本地设备上运行的应用程序实例。 Multipeer Connectivity 框架负责创建代表其他设备的对等 ID 对象。

要为本地应用程序创建新的对等 ID 并将显示名称与该 ID 关联,请调用 initWithDisplayName:。 对等点的名称在 UTF-8 编码中不得超过 63 个字节

MCSession

MCSession 对象启用和管理 Multipeer Connectivity 会话中所有对等方之间的通信。

  • 使用 MCPeerID 的 initWithDisplayName: 方法创建代表本地对等的对等 ID,或检索您之前存档的对等 ID(以随着时间的推移保持稳定的对等 ID)。

  • 使用带有方法 initWithPeer: 的对等 ID 来初始化会话对象。

  • 使用 MCNearbyServiceBrowser 对象、MCBrowserViewController 对象或您自己的对等发现代码邀请对等方加入会话。 (会话目前最多支持 8 个对等点,包括本地对等点。)

  • 设置 MCNearbyServiceAdvertiser 对象或 MCNearbyServiceAdvertiser 对象,以允许其他设备要求您的应用加入他们创建的会话。

  • 建立连接之后,自动保持重连,当应用退出前台之后,连接断开,重新进入前台恢复连接

MCNearbyServiceAdvertiser

MCNearbyServiceAdvertiser 类为您的应用程序通过 Multipeer Connectivity 框架提供的特定服务发布广告,并通知其委托有关来自附近对等方的邀请。

MCNearbyServiceBrowser

使用基础设施 Wi-Fi、点对点 Wi-Fi 和蓝牙(在 iOS 中)或以太网(在 macOS 和 tvOS 中)搜索(按服务类型)附近设备提供的服务,并提供轻松邀请这些服务的能力 设备连接到多点连接会话 (MCSession)。

MCAdvertiserAssistant(系统封装好的服务广播功能)

MCAdvertiserAssistant 是一个处理广告、向用户呈现传入邀请并处理用户响应的便利类。 当您的应用程序不需要对邀请过程进行编程控制时,使用此类提供用于处理邀请的用户界面。

MCBrowserViewController(系统封装好的服务广播发现功能)

MCBrowserViewController 类向用户显示附近的设备,并使用户能够邀请附近的设备加入会话

简单使用

创建广播服务

  • 创建MCPeerID对象(类似于设备搜索时候,发现的名称)

[[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name];

  • 根据MCPeerID创建一个MCSession

[[MCSession alloc] initWithPeer:self.myPeerID];

  • 创建广播服务,传入对等点信息,对等点附加信息,以及服务类型

[[MCNearbyServiceAdvertiser alloc] initWithPeer:self.myPeerID discoveryInfo:nil serviceType:myServiceType];

serviceType

要通告的服务类型。 这应该是描述应用程序网络协议的短文本字符串,格式与 Bonjour 服务类型(无传输协议)相同,并满足 RFC 6335(第 5.1 节)管理服务名称语法的限制。 特别是,字符串:

  • 长度必须为 1-15 个字符

  • 只能包含 ASCII 小写字母、数字和连字符

  • 必须至少包含一个 ASCII 字母

  • 不得以连字符开头或结尾

  • 不要包括与其他连字符相邻的连字符。

  • 这个名称应该很容易与不相关的服务区分开来。 例如,ABC 公司制作的文本聊天应用程序可以使用服务类型 abc-txtchat。

注意

在IOS14以上的版本,需要在info.plist设置对应的服务,如果没有设置则开启广播的时候会提示

Server did not publish: errorDict [{

NSNetServicesErrorCode = "-72008";

NSNetServicesErrorDomain = 10;

}].

添加方法

在info里配置NSBonjourServices信息

添加_nearByContent._tcp

image.png

如上图Bonjour services 服务名称为_nearByContent._tcp

在MCBrowserViewController中ServiceType为nearByContent

在MCAdvertiserAssistant中ServiceType为nearByContent

创建广播服务

  • 创建MCPeerID对象(类似于设备搜索时候,发现的名称)

[[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name];

  • 根据MCPeerID创建一个MCSession对象

[[MCSession alloc] initWithPeer:self.myPeerID];

  • 创建广播服务,传入对等点信息,对等点附加信息,以及服务类型

self.myAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:self.myPeerID discoveryInfo:nil serviceType:myServiceType];

  • 开启广播服务
[self.myAdvertiser startAdvertisingPeer];
  • 关闭广播服务
/// 停止广播自身服务

 [self.myAdvertiser stopAdvertisingPeer];

搜索广播服务

  • 根据自身对等点信息,以及需要发布广播服务的名称,初始化一个搜索浏览对象

self.myBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:self.myPeerID serviceType:myServiceType];

  • 获取附近搜索广播服务回调 发现一个回调一次,附带发现对等点的PeerID与该点所携带的附加信息

- (void) browser:(MCNearbyServiceBrowser *)browser

foundPeer:(MCPeerID *)peerID

withDiscoveryInfo:(nullable NSDictionary<NSString *, NSString *> *)info

  • 开始搜索服务
[self.myBrowser startBrowsingForPeers];
  • 结束搜索服务
[self.myBrowser stopBrowsingForPeers];

邀请加入会话

使用MCNearbyServiceBrowser向发现的对等点,发出邀请,需要对方的PeerID,以及自身的Session,还可以附带一段数据,并设置超时时间


[self.myBrowser invitePeer:peer toSession:self.mySession withContext:data timeout:10];

接收邀请并加入会话

发送方在发送邀请之后,接收方回收到一条邀请信息回调

该回调由advertiser负责接收


- (void) advertiser:(MCNearbyServiceAdvertiser *)advertiser

didReceiveInvitationFromPeer:(MCPeerID *)peerID

withContext:(nullable NSData *)context

invitationHandler:(void (^)(BOOL accept, MCSession * __nullable session))invitationHandler {

NSLog(@"谁发来的邀请 %@",peerID.displayName);

invitationHandler(YES,self.mySession);

}

接收方在接收之后,需要传递一个bool来判断是否同意建立连接。并传入自身Session

结束

这一节简单的介绍下近场服务的各个模块功能。

以及以下简单的功能实现

  • 简单发布服务广播
  • 搜索服务广播
  • 邀请加入服务
  • 接受广播服务并建立连接

下一节将介绍链接的加密设置,数据的发送与接收,并实现一个简单的近场文件传输工具demo。