[英]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.