1. 程式人生 > >MultipeerConnectivity 點對點連線

MultipeerConnectivity 點對點連線

簡單說吧:

在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];
}