1、基本原理:
Multipeer Connectivity是一个框架,用于苹果设备发现其他近场的苹果设备,以及苹果设备之间基于消息数据,流数据和资源数据的通信。对于iOS设备,底层数据传输是利用日常的WiFi网络,点对点wifi(也叫直连wifi,即不需要走路由器)和蓝牙;对于macOS和tvOS设备,则是利用日常wifi,点对点wifi以及以太网。
2、代码实现:
1)利用设备名初始化设备的peer id:
m_localPeerID = [[MCPeerID alloc] initWithDisplayName:[[MMDevice currentDevice] GetDeviceName]];
2)一个peer广播(advertise)自己的信息给近场的其他peer:
// discoveryInfo: 标识广播peer的身份,用于被其他peer发现时,进行校验m_advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:m_localPeerID discoveryInfo:discoveryInfo serviceType:serviceType];
m_advertiser.delegate = self; // 因为要使用MCNearbyServiceAdvertiseDelegate的方法
[m_advertiser startAdvertisingPeer];
3)另一个peer扫描自己所需的peer:
m_browser = [[MCNearbyServiceBrowser alloc] initWithPeer:m_localPeerID serviceType:serviceType];
m_browser.delegate = self; // 因为要使用MCNearbyServiceBrowserDelegate的方法[m_browser startBrowsingForPeers];
创建连接session,并邀请广播peer加入连接session:
// 找到一个广播peer- (void)browser:(MCNearbyServiceBrowser *)browser
foundPeer:(MCPeerID *)peerID
withDiscoveryInfo:(nullable NSDictionary<NSString *, NSString *> *)info
{
if(info是所需广播peer的discoveryInfo) {// 扫描peer用自己的peer id创建一个连接sessionm_clientSession = [[MCSession alloc] initWithPeer:m_localPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];m_clientSession.delegate = self; // 因为要使用MCSessionDelegate的方法// 设置context,以便广播peer收到邀请时,进行校验context = 双方事先商定好的校验信息:answerInfo;// 邀请广播peer加入连接session [browser invitePeer:peerID toSession:m_clientSession withContext:context timeout:30];// 停止扫描[browser stopBrowsingForPeers];}
}
5)广播peer收到扫描peer的“加入连接session”邀请:
- (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser
didReceiveInvitationFromPeer:(MCPeerID *)peerID
withContext:(NSData *)context
invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler
{ if (context is 事先商定好的answerInfo) {// 初始化“连接session” m_serverSession = [[MCSession alloc] initWithPeer:m_localPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];
m_serverSession.delegate = self;
// 接受邀请
invitationHandler(true, m_serverSession);
// 停止广播 [m_advertiser stopAdvertisingPeer];
} else {
invitationHandler(false, nil);
}
}
6)监听连接session的状态变化:
- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
{// 校验是否是目标peerID if(peerID is targetPeerID)
{
switch(state)
{
case MCSessionStateConnecting:
{
// peer正在加入连接session
}
break; case MCSessionStateConnected:
{
// peer已经加入连接session
}
break; case MCSessionStateNotConnected:
{
// peer没有加入连接session
}
break; default: break;
}
}
}
7)双方peer成功加入连接会话后,进行数据收发:
// 向目标peer发数据[session sendData:data toPeers:@[targetPeerID] withMode:MCSessionSendDataReliable error:&error];// 收到数据- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{ // 校验是否是目标peerID if(peerID is targetPeerID) { }}
备注:当然,利用Multipeer Connectivity实现数据传输的方式不止以上这一种,详情可以参考下面的官方文档。
官方文档链接:
[https://developer.apple.com/reference/multipeerconnectivity
](https://developer.apple.com/reference/multipeerconnectivity)