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

Multipeer Connectivity Not Connecting Programmatically

我正在创建一个 iOS/macOS 应用程序,它通过 Multipeer Connectivity Framework 使用远程控制功能。由于要远程监视和控制的设备将 运行 持续很长时间,因此使用自动视图控制器方法是不可行的,因为监视设备可能会被锁定或进入休眠状态,然后断开连接。所以我使用编程方法,这样当监控设备失去连接时,它们会在 unlocked/woken 启动并再次启动应用程序时自动配对。我的连接使用 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]

这是我连接的代码class

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)
}

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

[GCKSession] Wrong connection data. Participant ID from remote connection data = 6FBBAE66, local participant ID = 3A4C626C

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

虽然可能仍然存在一些其他连接问题。

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

旧代码

// Class Properties

static var localPeer : MCPeerID { return MCPeerID(displayName: GetPreferences.deviceName!) }

新代码

// Instance Properties
let localPeer = MCPeerID (displayName: GetPreferences.deviceName!)

我开始使用 TViOS 10.0 测试版...

 peerID = MCPeerID(displayName: UIDevice.current.name)

虽然我仍然看到这个错误...

 2016-09-08 10:13:43.016600 PeerCodeATV[208:51135] [ViceroyTrace] [ICE][ERROR] ICEStopConnectivityCheck() found no ICE check with call id (847172408)
 2016-09-08 10:13:47.577645 PeerCodeATV[208:51155] [GCKSession] SSLHandshake returned with error [-9819].

None 对我有用。
我已经解决了只禁用加密...

let session = MCSession(peer:myPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.none)

我在 iTunes 商店中使用了多年的应用程序也遇到了同样的问题。 最新的 10.1 beta 更新现在似乎修复了我的应用程序的蓝牙问题,而无需对我的代码进行任何更改。

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

我已经把这个问题给自己造成了两次。希望这有助于阅读的人!