mac开发系列19:苹果设备之间利用Multipeer Connectivity进行数据传输

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 *)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)

你可能感兴趣的:(mac开发系列19:苹果设备之间利用Multipeer Connectivity进行数据传输)