Swift3 多点连接不以编程方式连接
我正在创建一个iOS/macOS应用程序,通过Multipeer连接框架使用远程控制功能。由于要远程监视和控制的设备将在较长时间内运行,因此无法使用自动视图控制器方法,因为监视设备可能被锁定或进入睡眠状态,然后断开连接。因此,我使用编程方法,这样当监控设备失去连接时,它们将在解锁/唤醒时自动配对,并且应用程序再次启动。我的连接可以使用ViewController方法正常工作,但不能使用编程委托方法。广告、浏览和邀请工作正常,但当远程接受邀请时,我会出现几个错误,然后连接失败。奇怪的是,其中有几个错误是GCKSession错误 那么为什么它要尝试使用GameCenter框架呢?为什么在接受邀请后失败了?这可能只是Xcode 8/Swift 3/iOS 10/macOS Sierra Beta SDK中的一个bug吗Swift3 多点连接不以编程方式连接,swift3,multipeer-connectivity,ios10,macos-sierra,xcode8-beta4,Swift3,Multipeer Connectivity,Ios10,Macos Sierra,Xcode8 Beta4,我正在创建一个iOS/macOS应用程序,通过Multipeer连接框架使用远程控制功能。由于要远程监视和控制的设备将在较长时间内运行,因此无法使用自动视图控制器方法,因为监视设备可能被锁定或进入睡眠状态,然后断开连接。因此,我使用编程方法,这样当监控设备失去连接时,它们将在解锁/唤醒时自动配对,并且应用程序再次启动。我的连接可以使用ViewController方法正常工作,但不能使用编程委托方法。广告、浏览和邀请工作正常,但当远程接受邀请时,我会出现几个错误,然后连接失败。奇怪的是,其中有几个
[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的设备产生任何影响。它与苹果推荐的代码相反,但比推荐的方法工作得很好。:!裁判: