1、基本原理:
Multipeer Connectivity是一個框架,用于蘋果設(shè)備發(fā)現(xiàn)其他近場的蘋果設(shè)備,以及蘋果設(shè)備之間基于消息數(shù)據(jù),流數(shù)據(jù)和資源數(shù)據(jù)的通信。對于iOS設(shè)備,底層數(shù)據(jù)傳輸是利用日常的WiFi網(wǎng)絡(luò),點對點wifi(也叫直連wifi,即不需要走路由器)和藍(lán)牙;對于macOS和tvOS設(shè)備,則是利用日常wifi,點對點wifi以及以太網(wǎng)。
2、代碼實現(xiàn):
1)利用設(shè)備名初始化設(shè)備的peer id:
m_localPeerID = [[MCPeerID alloc] initWithDisplayName:[[MMDevice currentDevice] GetDeviceName]];
2)一個peer廣播(advertise)自己的信息給近場的其他peer:
// discoveryInfo: 標(biāo)識廣播peer的身份,用于被其他peer發(fā)現(xiàn)時,進(jìn)行校驗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];
創(chuàng)建連接session,并邀請廣播peer加入連接session:
// 找到一個廣播peer- (void)browser:(MCNearbyServiceBrowser *)browser
foundPeer:(MCPeerID *)peerID
withDiscoveryInfo:(nullable NSDictionary<NSString *, NSString *> *)info
{
if(info是所需廣播peer的discoveryInfo) {// 掃描peer用自己的peer id創(chuàng)建一個連接sessionm_clientSession = [[MCSession alloc] initWithPeer:m_localPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];m_clientSession.delegate = self; // 因為要使用MCSessionDelegate的方法// 設(shè)置context,以便廣播peer收到邀請時,進(jìn)行校驗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)監(jiān)聽連接session的狀態(tài)變化:
- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
{// 校驗是否是目標(biāo)peerID if(peerID is targetPeerID)
{
switch(state)
{
case MCSessionStateConnecting:
{
// peer正在加入連接session
}
break; case MCSessionStateConnected:
{
// peer已經(jīng)加入連接session
}
break; case MCSessionStateNotConnected:
{
// peer沒有加入連接session
}
break; default: break;
}
}
}
7)雙方peer成功加入連接會話后,進(jìn)行數(shù)據(jù)收發(fā):
// 向目標(biāo)peer發(fā)數(shù)據(jù)[session sendData:data toPeers:@[targetPeerID] withMode:MCSessionSendDataReliable error:&error];// 收到數(shù)據(jù)- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{ // 校驗是否是目標(biāo)peerID if(peerID is targetPeerID) { }}
備注:當(dāng)然,利用Multipeer Connectivity實現(xiàn)數(shù)據(jù)傳輸?shù)姆绞讲恢挂陨线@一種,詳情可以參考下面的官方文檔。
官方文檔鏈接:
[https://developer.apple.com/reference/multipeerconnectivity
](https://developer.apple.com/reference/multipeerconnectivity)