bde*_*paz 11 multipeer-connectivity swift3 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]
Run Code Online (Sandbox Code Playgroud)
这是我的连接类的代码
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)
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*lia 14
没有人对我有用.
我已解决只禁用加密...
let session = MCSession(peer:myPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.none)
Run Code Online (Sandbox Code Playgroud)
小智 5
当用于创建会话的 peerID 与用于创建广告商或浏览器的 peerID 不匹配时,我会收到这部分错误。
[GCKSession] Wrong connection data. Participant ID from remote connection data = 6FBBAE66, local participant ID = 3A4C626C
Run Code Online (Sandbox Code Playgroud)
一旦 peerID 匹配,那部分错误就会消失。
不过,可能仍然存在其他一些连接问题。
我发现出了什么问题。我传递给 MCSession 实例的 MCPeerID 对象,我将它作为计算类属性出售,而不是将其存储为存储属性。所以我把它改成了存储实例属性,一切都开始工作了!感谢 Tanya 为我指明了 MCPeerID 对象的方向。
旧代码
// Class Properties
static var localPeer : MCPeerID { return MCPeerID(displayName: GetPreferences.deviceName!) }
Run Code Online (Sandbox Code Playgroud)
新代码
// Instance Properties
let localPeer = MCPeerID (displayName: GetPreferences.deviceName!)
Run Code Online (Sandbox Code Playgroud)
我的问题是我从未设置 MCSession 的委托。我收到了OP提到的所有相同的错误消息,这让我认为连接已断开,但实际上我只是忘记设置委托。设置委托后,仍然打印所有错误消息,但否则我的委托方法在收到消息后会正常调用!
我已经两次给自己带来这个问题了。希望这有助于有人阅读!
| 归档时间: |
|
| 查看次数: |
8843 次 |
| 最近记录: |