多重连接未以编程方式连接

bde*_*paz 11 multipeer-connectivity swift3 ios10 macos-sierra xcode8-beta4

我正在创建一个iOS/macOS应用程序,它通过Multipeer Connectivity Framework使用远程控制功能.由于要远程监视和控制的设备将在较长时间内运行,因此使用自动视图控制器方法是不可行的,因为监视设备可能被锁定或进入休眠状态,然后断开连接.所以我使用的是编程方法,这样当监控设备失去连接时,他们会在解锁/唤醒并且应用程序再次启动时自动配对.我的连接使用ViewController方法工作正常,但不是编程委托方法.广告,浏览和邀请工作正常,但是当远程端接受邀请时,我会收到几个错误,然后连接失败.奇怪的是,有几个错误是GCKSession错误.

那么为什么要尝试使用GameCenter框架呢?为什么在接受邀请后失败?它可能只是Xcode 8/Swift 3/iOS 10/macOS Sierra Beta SDK中的一个错误吗?

[ViceroyTrace] [ICE][ERROR] ICEStopConnectivityCheck() found no ICE check with call id (2008493930)
[GCKSession] Wrong connection data. Participant ID from remote connection data = 6FBBAE66, local participant ID = 3A4C626C
[MCSession] GCKSessionEstablishConnection failed (FFFFFFFF801A0020)
Peer Changing
Failed
[GCKSession] Not in connected state, so giving up for participant [77B72F6A] on channel [0]
Run Code Online (Sandbox Code Playgroud)

这是我的连接类的代码

func startAdvertisingWithoutUI () {

    if advertiserService == nil {
        advertiserService = MCNearbyServiceAdvertiser (peer: LMConnectivity.peerID, discoveryInfo: nil, serviceType: "mlm-timers")
        advertiserService?.delegate = self
        session.delegate = self
    }

    advertiserService?.startAdvertisingPeer()

}

func browserForNearbyDevices () {

    if browserService == nil {
        browserService = MCNearbyServiceBrowser (peer: LMConnectivity.peerID, serviceType: "mlm-timers")
        browserService?.delegate = self
        session.delegate = self
    }

    browserService?.startBrowsingForPeers()
}

func sendInvitation(to peer: MCPeerID) {

    browserService?.invitePeer(peer, to: session, withContext: nil, timeout: 60)

}

func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: (Bool, MCSession?) -> Void) {

    let trustedNames = GetPreferences.trustedRemoteDevices

    for name in trustedNames {

        if name == peerID.displayName {
            invitationHandler(true,session)
            return
        }
    }

    invitationHandler (false, session)
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*lia 14

没有人对我有用.
我已解决只禁用加密...

let session = MCSession(peer:myPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.none)
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,在"MCEncryptionPreference.None"中,"无"现在是小写的. (2认同)

小智 5

当用于创建会话的 peerID 与用于创建广告商或浏览器的 peerID 不匹配时,我会收到这部分错误。

[GCKSession] Wrong connection data. Participant ID from remote connection data = 6FBBAE66, local participant ID = 3A4C626C
Run Code Online (Sandbox Code Playgroud)

一旦 peerID 匹配,那部分错误就会消失。

不过,可能仍然存在其他一些连接问题。


bde*_*paz 5

我发现出了什么问题。我传递给 MCSession 实例的 MCPeerID 对象,我将它作为计算类属性出售,而不是将其存储为存储属性。所以我把它改成了存储实例属性,一切都开始工作了!感谢 Tanya 为我指明了 MCPeerID 对象的方向。

旧代码

// Class Properties

static var localPeer : MCPeerID { return MCPeerID(displayName: GetPreferences.deviceName!) }
Run Code Online (Sandbox Code Playgroud)

新代码

// Instance Properties
let localPeer = MCPeerID (displayName: GetPreferences.deviceName!)
Run Code Online (Sandbox Code Playgroud)


Rus*_*add 5

我的问题是我从未设置 MCSession 的委托。我收到了OP提到的所有相同的错误消息,这让我认为连接已断开,但实际上我只是忘记设置委托。设置委托后,仍然打印所有错误消息,但否则我的委托方法在收到消息后会正常调用!

我已经两次给自己带来这个问题了。希望这有助于有人阅读!