MultipeerConnectivity 點對點連線
阿新 • • 發佈:2019-01-22
簡單說吧:
在IOS7中,介紹了一個全新的框架:MultipeerConnectivity,這個框架可以通過,同一Wifi,藍芽,來近距離傳輸資料。
我們今天的Demo,暫時會用到框架中的這些類:
MCAdvertiserAssistant //可以接收,並處理使用者請求連線的響應。沒有回撥,會彈出預設的提示框,並處理連線。 MCNearbyServiceAdvertiser //可以接收,並處理使用者請求連線的響應。但是,這個類會有回撥,告知有使用者要與您的裝置連線,然後可以自定義提示框,以及自定義連線處理。 MCNearbyServiceBrowser //用於搜尋附近的使用者,並可以對搜尋到的使用者發出邀請加入某個會話中。 MCPeerID //這表明是一個使用者 MCSession //啟用和管理Multipeer連線會話中的所有人之間的溝通。 通過Sesion,給別人傳送資料。
流程基本上是:
1.MCNearByServiceBrowser 發現使用者
它有三個回撥
//開啟瀏覽器失敗 - (void)browser:(MCNearbyServiceBrowser *)browser didNotStartBrowsingForPeers:(NSError *)error //發現附近的使用者 - (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info //某個使用者消失了 - (void)browser:(MCNearbyServiceBrowser *)browser lostPeer:(MCPeerID *)peerID
2.通過 MCNearByServicebrowser 邀請某個使用者加入某個會話
//下面的東西,需要你們自己例項化
[MCNearByServicebrowser invitePeer:MCPeerID toSession:MCSession withContext:NSData timeout:10];
3.MCNearbyServiceAdvertiser 處理接收到的邀請
//這個類,有下面這麼一個回撥
//接收到邀請 - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler //其中:invitationHandler 這個引數是用來處理是否接收請求的,如下所示 self.handler(YES,self.session); //這就表示你接受邀請了,系統將會你們的裝置進行匹配
4. MCSession 會話狀態的改變,以及接收到的訊息
//主要有2個回撥,如下所示//會話狀態發生改變 當我們接受別人的邀請的時候,就會觸發下面的會話回撥,表明,有人連線我們了,或者拒絕我們的邀請了。
- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
使用如下:
//會話狀態發生改變
- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
{
//接受邀請
if (state == MCSessionStateConnected && self.session) {
//傳送通知,告訴有人連線
[[NSNotificationCenter defaultCenter] postNotificationName:PeerConnectionAcceptedNotification object:nil userInfo:@{@"peer": peerID,@"accept":@YES}];
}
//邀請被拒絕
else if(state == MCSessionStateNotConnected && self.session){
//只處理不在會話中的
if (![self.session.connectedPeers containsObject:peerID]) {
[[NSNotificationCenter defaultCenter] postNotificationName:PeerConnectionAcceptedNotification object:nil userInfo:@{@"peer": peerID,@"accept":@NO}];
}
}
}
//從會話中接收到資料 如果有人給我們傳送資料,則會走這個回撥,從這裡,我們獲取到別人傳送給我們的資料
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID
使用如下:
//從會話中接收到資料
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID
{
//解析資料
NSString *msgStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
msgStr = [NSString stringWithFormat:@"%@:%@",peerID.displayName,msgStr];
//將資料加入集合中
[self.messageListArray addObject:msgStr];
//傳送通知,接收到資料
[[NSNotificationCenter defaultCenter] postNotificationName:DataReceivedNotification object:nil];
}