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,它会工作,然后连接失败!
我确认在连接对等体时遇到以下错误时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)
错误和连接状态更改为未连接.
我将iPhone从iOS 10.1更新到10.1.1,错误仍然存在,没有任何变化.
在从10.2(它仍然被破坏)到10.2.1的更新之后,它似乎再次工作(使用10.2.1的一个设备测试,另一个设备是旧的iOS 8设备.一个同事用10.2.1和10.2,奇怪的是它也有效)!仅使用蓝牙(禁用WiFi)时建立连接.但是,有时我仍然会在日志中获得所有ICE错误和连接错误,但并非总是如此.现在我试图重现它们,它运行没有警告.奇怪,但好消息是:似乎Apple修复了这个问题!
iOS 10 中的 Multipeer 是一大伤害。我昨天做了测试,似乎只有在打开 wifi 的情况下它才能工作(仅蓝牙已损坏)。
作为 Multipeer 的替代方案,您可以使用 dns_sd (Bonjour) 方法并构建您自己的方法。我制作了一个框架(Pod)来完成这个任务(它模仿 Multipeer)。它是单播而非多播,但仅支持角色和蓝牙。更多信息请参见: https: //github.com/xaphod/Bluepeer。恐怕我还没有测试过 tvOS,所以可能需要一些工作。欢迎拉请求;)
归档时间: |
|
查看次数: |
5564 次 |
最近记录: |