簡體   English   中英

邀請同伴參加MCSEssion

[英]Inviting Peer to MCSEssion

這是我第一次在stackoverflow上發帖,並且我知道嚴格的發帖要求。 如果我沒有遵循任何准則,請告訴我。

我目前正在使用Objective-C用Xcode編寫IOS(8.4)應用程序。 目標是使用MCSessions以便在IOS設備之間流式傳輸數據。 盡管在這里和其他地方閱讀了許多試圖澄清主題的帖子,但我目前仍在嘗試會議的概念。 這是我已經知道的資源:

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

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

這是我目前的理解:在最基本的層次上,您有一個廣告商和一個瀏覽器。 廣告商具有本地會話,這允許他們“廣告”。 當瀏覽器看到廣告商時,瀏覽器向廣告商發送邀請到其(瀏覽器的)本地MCSession。 假設一切正確,這就是我感到困惑的地方。 廣告商可以接受邀請,並在此過程中將其本地會話傳遞給InvitationHandler。

我已經在代碼中實現了以下邏輯,如下所示。 但是,在跟蹤廣告商和瀏覽器的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);


        }
    }

任何幫助是極大的贊賞!

奧斯汀

我在嘗試使用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對其進行初始化,也是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM