Multipeer ConnectivityFrameworkを介してリモートコントロール機能を使用するiOS/macOSアプリを作成しています。リモートで監視および制御されるデバイスは長期間実行されるため、監視デバイスがロックされたり、スリープ状態になってから接続が切断されたりする可能性があるため、自動ビューコントローラ方式を使用することはできません。そのため、私はプログラムによるアプローチを使用しており、監視デバイスが接続を失ったときに、ロックが解除/ウェイクアップされてアプリが再起動されたときに自動的にペアリングされます。私の接続は、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)
}
何が悪かったのかわかりました。 MCSessionインスタンスに渡したMCPeerIDオブジェクトは、Storedプロパティとして保存するのではなく、ComputedClassプロパティとして販売していました。そこで、それをStored Instance Propertyに変更すると、すべてが機能し始めました。 MCPeerIDオブジェクトの方向に私を向けてくれたTanyaに感謝します。
古いコード
// Class Properties
static var localPeer : MCPeerID { return MCPeerID(displayName: GetPreferences.deviceName!) }
新しいコード
// Instance Properties
let localPeer = MCPeerID (displayName: GetPreferences.deviceName!)
誰も私のために働いていません。
暗号化を無効にすることだけを解決しました...
let session = MCSession(peer:myPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.none)
私にとっての問題は、MCSessionのデリゲートを設定したことがないことでした。 OPが言及したのと同じエラーメッセージがすべて表示され、接続が切断されたと思われましたが、実際にはデリゲートを設定するのを忘れていました。デリゲートを設定した後も、すべてのエラーメッセージが出力されますが、それ以外の場合は、メッセージを受信するとデリゲートメソッドが正常に呼び出されます。
私はこの問題を自分自身に2回負わせました。うまくいけば、これは誰かが一緒に読んでいるのに役立ちます!
セッションの作成に使用されたpeerIDと、広告主またはブラウザの作成に使用されたpeerIDが一致しない場合、エラーのこの部分が発生します。
[GCKSession] Wrong connection data. Participant ID from remote connection data = 6FBBAE66, local participant ID = 3A4C626C
PeerIDが一致すると、エラーのその部分はなくなります。
ただし、他の接続の問題がまだある可能性があります。
これでTViOS10.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].
私がiTunesストアで何年も持っていたアプリで私にとって同じ問題。最新の10.1ベータアップデートは、コードを変更せずにアプリのBluetoothの問題を修正しているようです。