【问题标题】:Multipeer Connectivity Not Connecting Programmatically多点连接未以编程方式连接
【发布时间】:2016-12-09 06:43:15
【问题描述】:

我正在创建一个 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]

这是我的连接类的代码

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

【问题讨论】:

  • 不幸的是,我看到了同样的事情。就我而言,它是一个 macOS 和 tvOS 应用程序。
  • Multipeer(守护进程和服务)在 iOS 上的 GameCenter 服务中运行。

标签: swift3 multipeer-connectivity ios10 macos-sierra xcode8-beta4


【解决方案1】:

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

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

【讨论】:

  • 在工作 6 小时后也为我工作。你不知道我有多感谢你!
  • 感谢您的建议。如果我没有遇到这个,我会扯掉头发!
  • 仅供参考,MCEncryptionPreference.None "none" 现在是小写的。
  • 将加密设置为无对装有 iOS 12 的设备没有影响
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我必须通过这个来使用 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].
      

      【讨论】:

        【解决方案5】:

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

        旧代码

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

        新代码

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

        【讨论】:

        【解决方案6】:

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

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

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

        不过可能还有其他一些连接问题。

        【讨论】:

        • 我观察到同样的行为。 MCPeerID 实例应该相同。
        • 你能谈谈如何解决这个问题,即如何让它们匹配吗?究竟是什么导致了这个错误? @谭雅
        • @MJQZ1347我不记得了,但我有这三个的子类:MCNearbyServiceAdvertiserDelegate, MCNearbyServiceBrowserDelegate, MCSessionDelegate我为自己做了一个peerID:let myPeerId = MCPeerID(displayName: UIDevice.current.name)后来在代码中,我做了一个广告商和浏览器,使用相同的 peerID:let serviceAdvertiser = MCNearbyServiceAdvertiser(peer: myPeerId, discoveryInfo: nil, serviceType: ShareServiceType)let serviceBrowser = MCNearbyServiceBrowser(peer: myPeerId, serviceType: ShareServiceType) 我想这就是我所说的匹配。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 2015-10-21
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        相关资源
        最近更新 更多