首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >邀请同级加入MCSEssion

邀请同级加入MCSEssion
EN

Stack Overflow用户
提问于 2015-10-10 03:18:02
回答 1查看 433关注 0票数 2

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

我目前正在用Xcode编写一个IOS (8.4)应用程序,使用Objective-C。我们的目标是使用MCSessions在IOS设备之间传输数据。我目前正在为会话的概念而苦苦挣扎,尽管我在这里和其他地方读到了许多试图澄清这个主题的帖子。以下是我已经知道的资源:

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

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

我目前的理解是:在最基本的层面上,你有一个广告商和一个浏览器。广告商有一个本地会话,允许他们“做广告”。当浏览器看到广告商时,浏览器向广告商发送一个invite到他(浏览器)的本地MCSession。假设这些都是正确的,这就是我感到困惑的地方。广告商可以接受邀请,并在此过程中将其本地会话传递给invitationHandler。

我已经用代码实现了以下逻辑,如下所示。但是,在跟踪广告商和浏览器的MCSession状态更改时,将尝试连接,但最终状态始终为didNotNonnect。

发送邀请代码(浏览器):

代码语言:javascript
复制
[self.broadcasterBrowser invitePeer:[broadcasterPeerIDs objectAtIndex:indexPath.row]
        toSession: self.appDelegate.mpcHandler.session withContext:nil timeout:30.0 ];

接受邀请代码(Advertiser):

代码语言:javascript
复制
       - (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);


        }
    }

任何帮助都是非常感谢的!

奥斯汀

EN

回答 1

Stack Overflow用户

发布于 2016-09-21 15:30:57

我在尝试使用MPC时遇到了类似的问题。我创建了一个自定义类来处理所有的MPC连接细节。在测试时,我的广告商每次接受邀请时,都会抱怨错误的连接数据并失败。我发现问题在于我从我创建的类变量中为我的设备分配了MCPeerID对象,如下所示:

代码语言:javascript
复制
 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对象,并在邀请处理程序中返回它,如下所示:

代码语言:javascript
复制
 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。如下所示:

代码语言:javascript
复制
 let peerObject : MCPeerID = MCPeerID(displayName: deviceNameString)

然后剩下的代码就可以工作了,因为无论我为MCPeerID对象调用了多少次,它总是一样的。回过头来看,我不知道为什么我会以这种方式开始。:-)

然后,在我的连接类中,我存档并存储了浏览器和广告商的MCPeerID对象,这样广告商就可以自动接受受信任MCPeerID的邀请。如果您每次使用MCPeerID对象时都创建它,这是不可能的,即使您总是用相同的DisplayName初始化它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33045631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档