邀请同行参加 MCSEssion

Posted

技术标签:

【中文标题】邀请同行参加 MCSEssion【英文标题】:Inviting Peer to MCSEssion 【发布时间】:2015-10-09 19:18:02 【问题描述】:

这是我第一次在 *** 上发帖,我知道严格的发帖要求。如果我没有遵循任何准则,请告诉我。

我目前正在使用 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);


        
    

非常感谢任何帮助!

奥斯汀

【问题讨论】:

【参考方案1】:

我在尝试使用 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 对其进行初始化。

【讨论】:

以上是关于邀请同行参加 MCSEssion的主要内容,如果未能解决你的问题,请参考以下文章

通过通知邀请用户参加活动 - 手动工作,但不使用 Graph API

朋友不会被邀请参加 Facebook 中创建的活动

有没有办法邀请应用用户的朋友参加 Facebook 活动?

Google Play 游戏服务 2017:如何邀请某人参加多人比赛?

邀请您参加JBoss北京用户组会议

如何邀请朋友参加活动? iPhone中的Facebook Graph API