多点连接:对等点有时无法连接

coo*_*ita 0 ios multipeer-connectivity

我正在开发一款使用 MPC 的游戏。我让它工作了,但我发现连接(尤其是超过 2 个对等点)经常失败。对等方开始连接 (MCSessionState.Connecting),然后就不再连接 (MCSessionState.NotConnected)。其他时候,它就像一个魅力。

这只是框架的问题,还是我可能做错了什么?

我按照这个教程进行了操作。在我的实现中,玩家之一是浏览器,其余的是广告商。我想出的唯一解决方法是在获得 .NotConnected 标志时尝试再次连接,但有时它会尝试重新连接 3 或 4 次才能成功(花费太长时间)。

这是相关代码:

MPCManager(这个类是MCSessionDelegate、MCNearbyServiceBrowserDelegate、MCNearbyServiceAdvertiserDelegate)

func advertiser(advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: NSData?, invitationHandler: (Bool, MCSession) -> Void) {
    self.invitationHandler = invitationHandler

    delegate?.invitationWasReceived(peerID.displayName)
}

// MARK: MCSessionDelegate method implementation


func session(session: MCSession, peer peerID: MCPeerID, didChangeState state: MCSessionState) {
    switch state{
    case MCSessionState.Connected:
        print("Connected to session: \(session)")
        connectedPeers.append(peerID)
        delegate?.connectedWithPeer(peerID)

    case MCSessionState.Connecting:
        print("Connecting to session: \(session)")

    default:
        delegate?.disconnectedFromPeer(peerID)
        print("Did not connect to session: \(session)")
    }
}
Run Code Online (Sandbox Code Playgroud)

代表类:

func invitationWasReceived(fromPeer: String) {
    NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
        self.appDelegate.cManager!.invitationHandler(true, self.appDelegate.cManager!.session)
        self.connectingLabel.text = "Connecting"                
    })
}


func connectedWithPeer(peerID: MCPeerID) {
    NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
        self.connectingLabel.text = "Connected to \(peerID.displayName)"
        if self.appDelegate.cManager!.connectedPeers.count == self.appDelegate.cManager!.foundPeers.count {

        //game setup if all peers are connected
        //stop browsing and advertising
       }
    })
}

func disconnectedFromPeer(peerID: MCPeerID) {
    print("disconnected setup")
    NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
        self.connectingLabel.text = "Couldn't connect to \(peerID.displayName)\n\nRetrying"
        if self.isBrowser {
            self.appDelegate.cManager!.browser.invitePeer(peerID, toSession: self.appDelegate.cManager!.session, withContext: nil, timeout: 20)
        } 
    })


}
Run Code Online (Sandbox Code Playgroud)

Kev*_*Mac 5

实现这个委托方法

- (void)session:(MCSession *)session didReceiveCertificate:(NSArray *)certificate fromPeer:(MCPeerID *)peerID certificateHandler:(void (^)(BOOL accept))certificateHandler
{
     if (certificateHandler != nil)
     {
         certificateHandler(YES);
     }
}
Run Code Online (Sandbox Code Playgroud)