Swift MultipeerConnectivity-invitePeer 总是以超时结束

Posted

技术标签:

【中文标题】Swift MultipeerConnectivity-invitePeer 总是以超时结束【英文标题】:Swift MultipeerConnectivity - invitePeer always ends in a timeout 【发布时间】:2015-04-27 09:35:21 【问题描述】:

我目前正在开发一个需要连接 2 个同伴的游戏。为此,我已经通过this tutorial。我构建了描述的演示应用程序,它就像一个魅力,即我能够在我的 iPhone 5 和我的 Macbook Pro 之间聊天。 但是,现在我正在开发游戏应用程序,我无法再建立连接。基本上我所做的是在表格视图中显示所有广告商。单击给定单元格后,将执行以下代码:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    var peer = appDelegate.mcManager.foundPeers.keys.array[indexPath.row] as MCPeerID

    self.appDelegate.mcManager.joinGame(peer)

在 mcManager 中,joinGame 如下所示:

func joinGame(peer : MCPeerID)
    // Setup Advertising:
    self.setAdvertiserDiscoveryInfo(self.foundPeers[peer] as! [String:String])
    self.advertiser.startAdvertisingPeer()
    self.appDelegate.isAdvertising = true
    // Create Connection
    self.browser.invitePeer(peer, toSession: self.session, withContext: nil, timeout: self.connectingTimeout)

显然没有来自 XCode 的错误消息。每个代码都按应有的方式执行。即使是invitePeer(...) 也正在执行。但它总是以超时结束。

我在调试器中比较了演示应用程序(来自上面的教程)和游戏应用程序,我注意到一件事,即演示应用程序的浏览器变量包含一个带有一个键/值对的 _netServices 变量,而游戏应用程序没有(_netServices 为空)。

目前我不知道出了什么问题,因为我非常依赖给定的教程,即涉及很多复制/粘贴。由于第一个演示应用程序正在运行,我不知道发生了什么。

仅供参考,这里是 mcManager 的 init():

override init() 
    super.init()

    peer = MCPeerID(displayName: UIDevice.currentDevice().name)

    session = MCSession(peer: peer)
    session.delegate = self

    browser = MCNearbyServiceBrowser(peer: peer, serviceType: serviceType)
    browser.delegate = self

    advertiser = MCNearbyServiceAdvertiser(peer: peer, discoveryInfo: nil, serviceType: serviceType)
    advertiser.delegate = self


【问题讨论】:

【参考方案1】:

我终于找到了解决办法! 在我完全疯了之后,因为我没有发现任何问题,我创建了一个新项目并逐步添加了游戏应用程序中的代码。在每一步之后我都测试了代码。

最后我发现问题出在广告商及其发现信息上。当用户创建游戏时,我使用用户生成的发现信息重新初始化广告商。问题是重新初始化后我忘了放委托,即:

func setAdvertiserDiscoveryInfo(discoveryInfo: Dictionary<String, String>) 
    advertiser = MCNearbyServiceAdvertiser(peer: peer, discoveryInfo: discoveryInfo, serviceType: serviceType)
    advertiser.delegate = self // I forgot this line!

此外,我将发现信息变量初始化为[String : String]。编译器没有引发任何错误,所以我认为它是正确的。但是,只有当我将发现信息更改为 Dictionary&lt;String, String&gt; 时,才能建立连接。

【讨论】:

以上是关于Swift MultipeerConnectivity-invitePeer 总是以超时结束的主要内容,如果未能解决你的问题,请参考以下文章

Swift 反射

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift