2015-10-09 29 views
2

這是我第一次發佈在stackoverflow上,我知道嚴格的發佈要求。如果我沒有遵循任何指導方針,請告訴我。Inviting Peer to MCSEssion

我目前正在使用Objective-C在Xcode中編寫IOS(8.4)應用程序。目標是使用MCSession來在IOS設備之間傳輸數據。儘管在這裏和其他地方閱讀了大量的帖子,但我仍然在努力理解這個話題。下面是我的資源已經知道:

https://developer.apple.com/videos/play/wwdc2013-708/

https://medium.com/@phoenixy/using-multipeer-connectivity-120abacb9db

這是我目前的理解:在最基本的層面上,有廣告商和瀏覽器。廣告客戶有一個本地會話,可以讓他們「做廣告」。當瀏覽器看到廣告客戶時,瀏覽器向廣告客戶發送邀請給他(瀏覽器)的本地MCSession。假設這是完全正確的,這裏是我感到困惑的地方。廣告客戶可以接受邀請,並在此過程中將其本地會話傳遞給inviteHandler。

我已經在代碼中實現了以下邏輯,如下所示。但是,在追蹤廣告客戶和瀏覽器的MCSession狀態更改時,嘗試進行連接,但最終狀態始終爲didNotNonnect。發送邀請

代碼(瀏覽器):

[self.broadcasterBrowser invitePeer:[broadcasterPeerIDs objectAtIndex:indexPath.row] 
     toSession: self.appDelegate.mpcHandler.session withContext:nil timeout:30.0 ]; 

代碼接受邀請(廣告客戶):

 - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser 
didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler 
    { 
     ArrayInvitationHandler = [NSArray arrayWithObject:[invitationHandler copy]]; 

     // ask the user 
     UIAlertView *alertView = [[UIAlertView alloc] 
            initWithTitle:peerID.displayName 
            message:@"Would like to create a session with you" 
            delegate:self 
            cancelButtonTitle:@"Decline" 
            otherButtonTitles:@"Accept", nil]; 
     [alertView show]; 

     if (alertViewResult) 
     { 
      void (^invitationHandler)(BOOL, MCSession *) = [ArrayInvitationHandler objectAtIndex:0]; 
      invitationHandler(YES, self.appDelegate.mpcHandler.session); 


     } 
    } 

任何幫助,不勝感激!

奧斯汀

回答

0

我遇到了類似的問題,試圖使用MPC。我創建了一個自定義類來處理所有的MPC連接細節。在進行測試時,每次我的廣告客戶都會接受邀請,它會抱怨錯誤的連接數據並失敗。我發現,問題是,我是從一類變量,我創建瞭如下自動售貨機爲我的設備MCPeerID對象:

static var peerObject : MCPeerID { 
    return MCPeerID(displayName: deviceNameString) 
} 

lazy var sessionIVar = MCSession (peer: MyConnectivityClass.peerObject) 

func startAdvertisingForConnectivity() { 
    advertiserService = MCNearbyServiceAdvertiser (peer: MyConnectivityClass.peerObject, discoveryInfo: nil, serviceType: "my-multipeer-connectivity-service-identifier") 
} 

然後當我使用「peerObject」邀請我會初始化MCSession對象計算性能,並在邀請處理程序返回,就像這樣:

func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Swift.Void) { 
    invitationHandler(true, sessionIVar) 
} 

我認爲每一個我呼籲「MyConnectivityClass.peerObject」時,將給予回一個相同的peerID因爲我總是以相同的顯示初始化它名稱。事實證明,這不是事實。所以當我在做廣告時,我使用了一個peerID對象,然後在響應邀請時,我用包含完全不同peerID的MCSession對象進行響應。

所以解決方案是在我的連接處理程序類中將「MyConnectivityClass.peerObject」類的計算類屬性更改爲常量或Ivar。就像這樣:

let peerObject : MCPeerID = MCPeerID(displayName: deviceNameString) 

然後將代碼的其餘部分只是工作,因爲無論多少次,我呼籲MCPeerID對象,它總是相同的。回想起來,我不知道爲什麼我以我的方式開始使用它。:-)

然後在我的連接類中,爲瀏覽器和廣告客戶存檔並存儲了MCPeerID對象,以便我可以讓廣告客戶自動接受受信任MCPeerID的邀請。如果每次使用MCPeerID對象時都是不可能的,即使您始終使用相同的DisplayName對其進行初始化。