Multipeer Connectivity无法以编程方式连接

时间:2016-08-03 13:41:55

标签: swift3 multipeer-connectivity 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]

以下是我的连接类

中的代码
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)
}

6 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:3)

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

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

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

但是可能还有其他一些连接问题。

答案 2 :(得分:3)

我的问题是我从未设置过MCSession的委托。我得到了OP提到的所有相同的错误消息,这让我觉得连接被破坏了,但实际上我忘了设置委托了。设置委托后,仍会打印所有错误消息,但在接收消息后,我的委托方法会被正常调用!

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

答案 3 :(得分:2)

我发现了什么问题。我传入MCSession实例的MCPeerID对象,我将其作为Computed Class Property出售,而不是将其存储为Stored Property。所以我把它改成了一个Stored Instance Property,一切都开始了!感谢Tanya将我指向了MCPeerID对象的方向。

旧代码

// Class Properties

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

新代码

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

答案 4 :(得分:1)

我开始使用TViOS 10.0 beta ...

STATIC_ASSERT(sizeof(int) >= sizeof(int32_t), int_is_less_than_32_bit);    

const bool foo = true;
STATIC_ASSERT(foo, foo_is_not_true); 

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

<script type="text/javascript" src="https://some-url/some-js.js"></script>
var obj = new OBbj-From-JS();

答案 5 :(得分:1)

对于我来说,我在itunes商店已有多年的应用程序同样存在问题。 最新的10.1测试版更新现在似乎解决了我的应用程序的蓝牙问题,而我的代码没有任何变化。