Swift MultipeerConnectivity - invitePeer 总是以超时结束
Swift MultipeerConnectivity - invitePeer always ends in a timeout
我目前正在开发一个需要连接 2 个同伴的游戏。为此,我经历了 this tutorial。我构建了所描述的演示应用程序,它运行得非常棒,即我能够在我的 iPhone 5 和我的 Macbook Pro 之间聊天。
但是,现在我正在处理游戏应用程序,我无法再建立连接。基本上我所做的是在 table 视图中显示所有广告商。单击给定单元格后,将执行以下代码:
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 变量和一对 key/value,而游戏应用程序则没有(_netServices 为空)。
目前我不知道哪里出了问题,因为我主要基于给定的教程,即涉及很多 copy/paste。由于第一个演示应用程序正在运行,我不知道发生了什么。
仅供参考,这里是 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
}
我终于找到解决办法了!
在我完全疯了之后,因为我没有发现任何问题,所以我创建了一个新项目并逐步添加了游戏应用程序中的代码。在每一步之后我都测试了代码。
最后我发现,问题出在广告商及其发现信息上。当用户创建游戏时,我使用用户生成的发现信息重新初始化广告商。问题是在重新初始化之后我忘了放置委托,即:
func setAdvertiserDiscoveryInfo(discoveryInfo: Dictionary<String, String>) {
advertiser = MCNearbyServiceAdvertiser(peer: peer, discoveryInfo: discoveryInfo, serviceType: serviceType)
advertiser.delegate = self // I forgot this line!
}
此外,我将发现信息变量初始化为[String : String]
。编译器没有引发任何错误,所以我认为它是正确的。但是,只有当我将发现信息更改为 Dictionary<String, String>
.
时,连接才有可能
我目前正在开发一个需要连接 2 个同伴的游戏。为此,我经历了 this tutorial。我构建了所描述的演示应用程序,它运行得非常棒,即我能够在我的 iPhone 5 和我的 Macbook Pro 之间聊天。 但是,现在我正在处理游戏应用程序,我无法再建立连接。基本上我所做的是在 table 视图中显示所有广告商。单击给定单元格后,将执行以下代码:
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 变量和一对 key/value,而游戏应用程序则没有(_netServices 为空)。
目前我不知道哪里出了问题,因为我主要基于给定的教程,即涉及很多 copy/paste。由于第一个演示应用程序正在运行,我不知道发生了什么。
仅供参考,这里是 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
}
我终于找到解决办法了! 在我完全疯了之后,因为我没有发现任何问题,所以我创建了一个新项目并逐步添加了游戏应用程序中的代码。在每一步之后我都测试了代码。
最后我发现,问题出在广告商及其发现信息上。当用户创建游戏时,我使用用户生成的发现信息重新初始化广告商。问题是在重新初始化之后我忘了放置委托,即:
func setAdvertiserDiscoveryInfo(discoveryInfo: Dictionary<String, String>) {
advertiser = MCNearbyServiceAdvertiser(peer: peer, discoveryInfo: discoveryInfo, serviceType: serviceType)
advertiser.delegate = self // I forgot this line!
}
此外,我将发现信息变量初始化为[String : String]
。编译器没有引发任何错误,所以我认为它是正确的。但是,只有当我将发现信息更改为 Dictionary<String, String>
.