web-dev-qa-db-ja.com

swift 3.0 TViOS 10.0 MultipeerConnectivityは機能しますが、エラーが発生します

このコードを使用して、TViOS10.0でマルチピア接続をセットアップします。

import UIKit
import MultipeerConnectivity

class MPCHandler: NSObject, MCSessionDelegate {

var peerID: MCPeerID!
var session: MCSession!
var browser: MCBrowserViewController!
var advertiser: MCAdvertiserAssistant? = nil

func setupPeerWithDisplayName (displayName: String) {
    peerID = MCPeerID(displayName: UIDevice.current.name)
}

func setupSession() {
    session = MCSession(peer: peerID)
    session.delegate = self
}

func setupBrowser() {
    browser = MCBrowserViewController(serviceType: "my-game", session: session)
}

func advertiseSelf(advertise:Bool) {
    if advertise {
        advertiser = MCAdvertiserAssistant(serviceType: "my-game", discoveryInfo: nil, session: session)
        advertiser!.start()
    } else {
        advertiser!.stop()
        advertiser = nil
    }
}

public class MyClass {
    static let myNotification = Notification.Name("MPC_DidChangeStateNotification")
}

public class MyClass2 {
    static let myNotification = Notification.Name("MPC_DidRecieveDataNotification")
}

func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
    let userInfo = ["peerID":peerID,"state":state.rawValue] as [String : Any]
    DispatchQueue.main.async {
        NotificationCenter.default.post(name: MyClass.myNotification, object: nil, userInfo: userInfo)
    }
}
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
    let userInfo = ["data":data, "peerID":peerID] as [String : Any]
    DispatchQueue.main.async {
        NotificationCenter.default.post(name: MyClass2.myNotification, object: nil, userInfo: userInfo)
    }
}
func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL, withError error: Error?) {
    // code
}
func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
    // code
}
func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
    // code
}

}

レポートは接続されていますが、このエラーが発生しますか?同じネットワーク上のTViOSとiPhoneの両方のデバイス。

2016-09-08 11:13:13.602572 PeerCodeATV[172:7628] [ViceroyTrace] [ICE][ERROR]     ICEStopConnectivityCheck() found no ICE check with call id (1969443468)
2016-09-08 11:13:17.168110 PeerCodeATV[172:7686] [ViceroyTrace] [ICE][ERROR]    Send BINDING_REQUEST failed(C01A0041).
2016-09-08 11:13:18.044156 PeerCodeATV[172:7686] [ViceroyTrace] [ICE][ERROR]    Send BINDING_REQUEST failed(C01A0041).
2016-09-08 11:13:18.766040 PeerCodeATV[172:7686] [ViceroyTrace] [ICE][ERROR]    Send BINDING_REQUEST failed(C01A0041).
2016-09-08 11:13:20.015846 PeerCodeATV[172:7686] [ViceroyTrace] [ICE][ERROR]    
2016-09-08 11:13:24.453030 PeerCodeATV[172:7588] [GCKSession] Not in connected state, so giving up for participant [7563528C] on channel [0].
2016-09-08 11:13:24.476176 PeerCodeATV[172:7588] [GCKSession] Not in connected state, so giving up for participant [7563528C] on channel [1].
2016-09-08 11:13:24.498394 PeerCodeATV[172:7588] [ViceroyTrace] [ICE][ERROR] ICEStopConnectivityCheck() found no ICE check with call id (1969443468)
2016-09-08 11:13:24.498840 PeerCodeATV[172:7588] [GCKSession] Not in connected state, so giving up for participant [7563528C] on channel [2].
2016-09-08 11:13:24.522667 PeerCodeATV[172:7588] [ViceroyTrace] [ICE][ERROR] ICEStopConnectivityCheck() found no ICE check with call id (1969443468)
2016-09-08 11:13:24.522954 PeerCodeATV[172:7588] [GCKSession] Not in connected state, so giving up for participant [7563528C] on channel [3].
2016-09-08 11:13:24.545934 PeerCodeATV[172:7588] [ViceroyTrace] [ICE][ERROR] ICEStopConnectivityCheck() found no ICE check with call id (1969443468)

IOSからiOSへのコードをすでにテストしました。同じiOSで完全に機能しますが、iOS9.2を実行しているiPad-> TViOS 10.0これらのエラーが表示されますか?

これらのエラーでAppleTVを再起動すると機能しますが、その後の接続は失敗します!!

12
user3069232

互換性のない暗号化設定エラーの解決

ピアの接続中に次のエラーが発生したときに、yonivavが正しい方向に進んでいたことを確認します。

[MCSession] Peer [DisplayName] has incompatible encryption preference [Required].

ただし、セッション暗号化設定を.noneに設定しても機能しませんでした。 https://developer.Apple.com/reference/multipeerconnectivity/mcsession/1407000-init で、次のように述べられています。

IOS 9以降にリンクされているアプリでは、暗号化が必須に設定されています。 iOS 9より前にリンクされたアプリでは、暗号化はオプションに設定されています。

IOS 10.1で1つのクライアントを使用し、iOSバージョンが低い別のクライアントを使用していたため、を使用してセッションを初期化しました。

var session = MCSession(peer: ownPeerID, 
                        securityIdentity: nil, 
                        encryptionPreference: .optional)

そして、接続は再び確実に機能します。

Bluetoothの問題

ただし、Bluetoothのみで接続が確立されていないことを確認する必要があります。招待状が送信されて受け入れられ、接続状態が接続状態に変わり、10秒後に接続されなくなります。状態を接続に変更した直後

[ViceroyTrace] [ICE][ERROR] ICEStopConnectivityCheck() found no ICE check with call id (108154439)

エラーがスローされます。

IOS 10.1デバイスでWifiとBluetoothをオンにすると、Bluetoothのみのデバイスが検出され、その後に1ダースが検出されます。

[ViceroyTrace] [ICE][ERROR] Send BINDING_REQUEST failed(C01A0041).

エラーと接続状態が未接続に変わります。

IOS 10.1.1へのアップデート:まだ壊れています

IPhoneをiOS10.1から10.1.1にアップデートしましたが、エラーは引き続き発生し、まったく変更されません。

IOS 10.2.1へのアップデート:動作しているようです!

10.2(まだ壊れていた)から10.2.1にアップデートした後、再び動作するようです(1つのデバイスで10.2.1を使用してテストし、もう1つのデバイスは古いiOS8デバイスでした。同僚が10.2.1と10.2そして奇妙なことにそれもうまくいきました)! Bluetoothのみを使用している場合(WiFiを無効にしている場合)に接続が確立されます。ただし、ログにすべてのICEエラーと接続エラーが記録されることがありますが、常にそうとは限りません。今、私はそれらを再現しようとしました、そしてそれは警告なしで走ります。奇妙ですが、良いニュースは次のとおりです。Apple問題を修正したようです!

8
Lupinity Labs

私の場合、代わりに:

_mpcSession = [[MCSession alloc] initWithPeer:self.mpcPeerID];

私が使用した:

_mpcSession = [[MCSession alloc] initWithPeer:self.mpcPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];

4
yonivav

IOS10のMultipeerは痛いです。昨日テストを行いましたが、wifiがオンになっている場合にのみ機能するようです(Bluetoothのみが壊れています)。

Multipeerの代わりに、dns_sd(Bonjour)アプローチを使用して、独自のアプローチを構築できます。これを正確に実行するフレームワーク(ポッド)を作成しました(Multipeerを模倣します)。マルチキャストではなくユニキャストですが、ロールとBluetoothのみをサポートします。詳細はこちら: https://github.com/xaphod/Bluepeer 。 tvOSでテストしたことがないので、作業が必要になる可能性があります。プルリクエストを歓迎します;)

3
xaphod

Appleから回答を得ました。これらのメッセージは無視できるようです。それらは、ログの変更に関連する副作用のようです。

ロギングの変更の詳細については、これをご覧ください...

(この変更に興味がある場合は、WWDC 2016の次のビデオをご覧ください: https://developer.Apple.com/videos/play/wwdc2016/721/ )。

3
user3069232

私のアプリに機能を開発します:2つのiOSデバイス間でビデオをストリーミングします。別のデバイスにビデオをストリーミングできません。あなたと同じログメッセージが表示されます。問題はログに記載されているとおりです。

[ERROR] ProcessEvent:1199 Send BINDING_REQUEST failed(C01A0041). [ERROR] ICEStopConnectivityCheck:2688 ICEStopConnectivityCheck() found no ICE check with call idしかし、何度もデバッグを試みた後、デリゲートfunctionの間違ったAVCaptureVideoDataOutputSampleBufferDelegateを宣言したことがわかりました。デリゲートfunctionを修正した後、2つのiOSデバイス間でビデオをストリーミングできます->タスクを完了

しかし、以前と同じログを取得しました。したがって、この機能が機能している場合は、ログメッセージを無視するか、Appleに報告することができます。私はすでにこのバグをAppleに報告しています。

1
lee