2015-04-27 34 views
0

我目前正在研究一个需要连接2个同伴的游戏。为此,我已经通过this tutorial。我构建了所描述的演示应用程序,它的功能就像一个魅力,即我可以在我的iPhone 5和我的Macbook Pro之间进行聊天。 但是,现在我正在研究游戏应用程序,我无法再建立连接。基本上我所做的是我以表格的形式显示所有广告客户。一旦一个点击一个给定的电池,下面的代码会被执行:Swift MultipeerConnectivity - invitePeer总是以超时结束

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 

} 

回答

0

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

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

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>时才能进行连接。