swift 3.0 TViOS 10.0 MultipeerConnectivity有效,但有错误

use*_*232 12 television multipeer-connectivity swift3

使用此代码在TViOS 10.0下设置Multipeer连接.

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
}

}
Run Code Online (Sandbox Code Playgroud)

报告已连接,但我收到此错误?两个设备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)
Run Code Online (Sandbox Code Playgroud)

我已经测试了iOS到iOS的代码,它可以在同一个iOS上完美运行,但运行iOS 9.2的iPad - > TViOS 10.0我看到这些错误了吗?

如果我重新启动带有这些错误的AppleTV,它会工作,然后连接失败!

Lup*_*abs 8

解决不兼容的加密首选项错误

我确认在连接对等体时遇到以下错误时yonivav在正确的轨道上:

[MCSession] Peer [DisplayName] has incompatible encryption preference [Required].
Run Code Online (Sandbox Code Playgroud)

但是,将会话加密首选项设置.none为对我不起作用.在https://developer.apple.com/reference/multipeerconnectivity/mcsession/1407000-init,声明

在iOS 9上或之后链接的应用上,加密设置为必需.在iOS 9之前链接的应用上,加密设置为可选.

由于我在iOS 10.1上使用了一个客户端,而在iOS版本中使用了另一个客户端,因此我使用了初始化会话

var session = MCSession(peer: ownPeerID, 
                        securityIdentity: nil, 
                        encryptionPreference: .optional)
Run Code Online (Sandbox Code Playgroud)

并且连接再次可靠地工作.

蓝牙问题

但是,我必须确认仅使用蓝牙才建立连接.发送和接受邀请,连接状态变为连接,然后在10秒后连接到未连接.在改变状态到连接之后

[ViceroyTrace] [ICE][ERROR] ICEStopConnectivityCheck() found no ICE check with call id (108154439)
Run Code Online (Sandbox Code Playgroud)

错误被抛出.

如果我在iOS 10.1设备上打开Wifi和蓝牙,则会发现仅蓝牙设备,然后是十几个

[ViceroyTrace] [ICE][ERROR] Send BINDING_REQUEST failed(C01A0041).
Run Code Online (Sandbox Code Playgroud)

错误和连接状态更改为未连接.

更新到iOS 10.1.1:仍然破碎

我将iPhone从iOS 10.1更新到10.1.1,错误仍然存​​在,没有任何变化.

更新到iOS 10.2.1:似乎工作!

在从10.2(它仍然被破坏)到10.2.1的更新之后,它似乎再次工作(使用10.2.1的一个设备测试,另一个设备是旧的iOS 8设备.一个同事用10.2.1和10.2,奇怪的是它也有效)!仅使用蓝牙(禁用WiFi)时建立连接.但是,有时我仍然会在日志中获得所有ICE错误和连接错误,但并非总是如此.现在我试图重现它们,它运行没有警告.奇怪,但好消息是:似乎Apple修复了这个问题!


xap*_*hod 3

iOS 10 中的 Multipeer 是一大伤害。我昨天做了测试,似乎只有在打开 wifi 的情况下它才能工作(仅蓝牙已损坏)。

作为 Multipeer 的替代方案,您可以使用 dns_sd (Bonjour) 方法并构建您自己的方法。我制作了一个框架(Pod)来完成这个任务(它模仿 Multipeer)。它是单播而非多播,但仅支持角色和蓝牙。更多信息请参见: https: //github.com/xaphod/Bluepeer。恐怕我还没有测试过 tvOS,所以可能需要一些工作。欢迎拉请求;)