このコードを使用して、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を再起動すると機能しますが、その後の接続は失敗します!!
ピアの接続中に次のエラーが発生したときに、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のみで接続が確立されていないことを確認する必要があります。招待状が送信されて受け入れられ、接続状態が接続状態に変わり、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).
エラーと接続状態が未接続に変わります。
IPhoneをiOS10.1から10.1.1にアップデートしましたが、エラーは引き続き発生し、まったく変更されません。
10.2(まだ壊れていた)から10.2.1にアップデートした後、再び動作するようです(1つのデバイスで10.2.1を使用してテストし、もう1つのデバイスは古いiOS8デバイスでした。同僚が10.2.1と10.2そして奇妙なことにそれもうまくいきました)! Bluetoothのみを使用している場合(WiFiを無効にしている場合)に接続が確立されます。ただし、ログにすべてのICEエラーと接続エラーが記録されることがありますが、常にそうとは限りません。今、私はそれらを再現しようとしました、そしてそれは警告なしで走ります。奇妙ですが、良いニュースは次のとおりです。Apple問題を修正したようです!
私の場合、代わりに:
_mpcSession = [[MCSession alloc] initWithPeer:self.mpcPeerID];
私が使用した:
_mpcSession = [[MCSession alloc] initWithPeer:self.mpcPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];
IOS10のMultipeerは痛いです。昨日テストを行いましたが、wifiがオンになっている場合にのみ機能するようです(Bluetoothのみが壊れています)。
Multipeerの代わりに、dns_sd(Bonjour)アプローチを使用して、独自のアプローチを構築できます。これを正確に実行するフレームワーク(ポッド)を作成しました(Multipeerを模倣します)。マルチキャストではなくユニキャストですが、ロールとBluetoothのみをサポートします。詳細はこちら: https://github.com/xaphod/Bluepeer 。 tvOSでテストしたことがないので、作業が必要になる可能性があります。プルリクエストを歓迎します;)
Appleから回答を得ました。これらのメッセージは無視できるようです。それらは、ログの変更に関連する副作用のようです。
ロギングの変更の詳細については、これをご覧ください...
(この変更に興味がある場合は、WWDC 2016の次のビデオをご覧ください: https://developer.Apple.com/videos/play/wwdc2016/721/ )。
私のアプリに機能を開発します: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に報告しています。