Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift3 多点连接不以编程方式连接_Swift3_Multipeer Connectivity_Ios10_Macos Sierra_Xcode8 Beta4 - Fatal编程技术网

Swift3 多点连接不以编程方式连接

Swift3 多点连接不以编程方式连接,swift3,multipeer-connectivity,ios10,macos-sierra,xcode8-beta4,Swift3,Multipeer Connectivity,Ios10,Macos Sierra,Xcode8 Beta4,我正在创建一个iOS/macOS应用程序,通过Multipeer连接框架使用远程控制功能。由于要远程监视和控制的设备将在较长时间内运行,因此无法使用自动视图控制器方法,因为监视设备可能被锁定或进入睡眠状态,然后断开连接。因此,我使用编程方法,这样当监控设备失去连接时,它们将在解锁/唤醒时自动配对,并且应用程序再次启动。我的连接可以使用ViewController方法正常工作,但不能使用编程委托方法。广告、浏览和邀请工作正常,但当远程接受邀请时,我会出现几个错误,然后连接失败。奇怪的是,其中有几个

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

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

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

当用来创建会话的peerID和用来创建广告客户或浏览器的peerID不匹配时,我得到了这部分错误

[GCKSession] Wrong connection data. Participant ID from remote connection data = 6FBBAE66, local participant ID = 3A4C626C
一旦peerIDs匹配,这部分错误就会消失


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

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

旧代码

// 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].
没有一个对我有用。
我已决定只禁用加密

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

我在itunes商店上使用了多年的一个应用程序也遇到了同样的问题。
最新的10.1测试版更新现在似乎解决了我的应用程序的蓝牙问题,而没有对我的代码进行任何更改。

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


我已经两次把这个问题强加给自己了。希望这有助于读者阅读

不幸的是,我也看到了同样的事情。在我的例子中,它是macOS和tvOS应用程序。Multipeer(守护进程和服务)在iOS上的GameCenter服务中运行。我观察到了相同的行为。麦克菲里德的例子应该是相同的。你能谈谈如何解决这个问题,即如何使它们匹配吗?到底是什么导致了这个错误@Tanya@MJQZ1347I我不确定我是否还记得了,但我有三个子类:
MCNearbyServiceAdvertiserDelegate,MCNearbyServiceBrowserDelegate,MCSessionDelegate
我为自己做了一个peerID:
让myPeerId=MCPeerID(displayName:UIDevice.current.name)
后来在代码中,我做了一个广告商和浏览器,使用相同的peerID:
let-serviceAdvertiser=MCNearbyServiceAdvertiser(peer:myPeerId,discoveryInfo:nil,serviceType:ShareServiceType)
let-serviceBrowser=MCNearbyServiceBrowser(peer:myPeerId,serviceType:ShareServiceType)
我想这就是我所说的匹配。在工作了6个小时后,我也为我工作。你不知道我有多谢你!谢谢你的建议。如果我没有遇到这个,我会把头发撕下来的!仅供参考,在
MCEncryptionPreference.None
中,“None”现在是小写。将加密设置为None不会对iOS 12的设备产生任何影响。它与苹果推荐的代码相反,但比推荐的方法工作得很好。:!裁判: