我正在创建一个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)
}
答案 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测试版更新现在似乎解决了我的应用程序的蓝牙问题,而我的代码没有任何变化。