多点连接未以编程方式连接
Multipeer Connectivity Not Connecting Programmatically
我正在创建一个 iOS/macOS 应用程序,它通过 Multipeer Connectivity Framework 使用远程控制功能。由于要远程监视和控制的设备将 运行 持续很长时间,因此使用自动视图控制器方法是不可行的,因为监视设备可能会被锁定或进入休眠状态,然后断开连接。所以我使用编程方法,这样当监控设备失去连接时,它们会在 unlocked/woken 启动并再次启动应用程序时自动配对。我的连接使用 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]
这是我连接的代码class
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
一旦 peerID 匹配,那部分错误就会消失。
虽然可能仍然存在一些其他连接问题。
我发现出了什么问题。我传递给 MCSession 实例的 MCPeerID 对象,我将其作为 Computed Class 属性 出售,而不是将其存储为 Stored 属性。所以我将其更改为存储实例 属性,一切都开始工作了!感谢 Tanya 为我指明了 MCPeerID 对象的方向。
旧代码
// 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].
None 对我有用。
我已经解决了只禁用加密...
let session = MCSession(peer:myPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.none)
我在 iTunes 商店中使用了多年的应用程序也遇到了同样的问题。
最新的 10.1 beta 更新现在似乎修复了我的应用程序的蓝牙问题,而无需对我的代码进行任何更改。
我的问题是我从未设置 MCSession 的委托。我收到了 OP 提到的所有相同错误消息,这让我认为连接已断开,但实际上我只是忘了设置委托。设置委托后,仍然打印所有错误消息,但除此之外,我的委托方法在收到消息后可以正常调用!
我已经把这个问题给自己造成了两次。希望这有助于阅读的人!
我正在创建一个 iOS/macOS 应用程序,它通过 Multipeer Connectivity Framework 使用远程控制功能。由于要远程监视和控制的设备将 运行 持续很长时间,因此使用自动视图控制器方法是不可行的,因为监视设备可能会被锁定或进入休眠状态,然后断开连接。所以我使用编程方法,这样当监控设备失去连接时,它们会在 unlocked/woken 启动并再次启动应用程序时自动配对。我的连接使用 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]
这是我连接的代码class
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
一旦 peerID 匹配,那部分错误就会消失。
虽然可能仍然存在一些其他连接问题。
我发现出了什么问题。我传递给 MCSession 实例的 MCPeerID 对象,我将其作为 Computed Class 属性 出售,而不是将其存储为 Stored 属性。所以我将其更改为存储实例 属性,一切都开始工作了!感谢 Tanya 为我指明了 MCPeerID 对象的方向。
旧代码
// 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].
None 对我有用。
我已经解决了只禁用加密...
let session = MCSession(peer:myPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.none)
我在 iTunes 商店中使用了多年的应用程序也遇到了同样的问题。 最新的 10.1 beta 更新现在似乎修复了我的应用程序的蓝牙问题,而无需对我的代码进行任何更改。
我的问题是我从未设置 MCSession 的委托。我收到了 OP 提到的所有相同错误消息,这让我认为连接已断开,但实际上我只是忘了设置委托。设置委托后,仍然打印所有错误消息,但除此之外,我的委托方法在收到消息后可以正常调用!
我已经把这个问题给自己造成了两次。希望这有助于阅读的人!