12

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

那么它为什么要尝试使用 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]

这是我的连接类的代码

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

6 回答 6

16

没有一个对我有用。
我只解决了禁用加密...

let session = MCSession(peer:myPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.none)
于 2016-09-09T13:25:40.700 回答
5

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

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

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

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

于 2016-08-10T13:31:55.857 回答
5

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

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

于 2017-01-31T04:38:33.407 回答
5

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

旧代码

// Class Properties

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

新代码

// Instance Properties
let localPeer = MCPeerID (displayName: GetPreferences.deviceName!)
于 2016-08-28T17:04:32.897 回答
1

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

于 2016-10-08T02:49:56.743 回答
1

我必须通过这个来使用 TViOS 10.0 beta ......

 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].
于 2016-09-08T08:16:43.717 回答