swift3 - swift 3.0 TViOS 10.0 MultipeerConnectivity funciona, pero con errores
multipeer-connectivity (5)
Resolviendo el error de preferencia de cifrado incompatible
Confirmo que yonivav estaba en el camino correcto al encontrar el siguiente error durante la conexión de mis compañeros:
[MCSession] Peer [DisplayName] has incompatible encryption preference [Required].
Sin embargo, establecer la preferencia de encriptación de sesión en .none
no funcionó para mí. En https://developer.apple.com/reference/multipeerconnectivity/mcsession/1407000-init se afirma que
En las aplicaciones vinculadas en o después de iOS 9, el cifrado está configurado como obligatorio. En aplicaciones vinculadas antes de iOS 9, el cifrado está configurado como opcional.
Como estaba usando un cliente en iOS 10.1 y otro cliente con una versión de iOS inferior, inicié la sesión usando
var session = MCSession(peer: ownPeerID,
securityIdentity: nil,
encryptionPreference: .optional)
y la conexión funciona de manera confiable nuevamente.
Problemas con Bluetooth
Sin embargo, debo confirmar que la conexión no está establecida solo con Bluetooth. La invitación se envía y se acepta, el estado de la conexión cambia a la conexión y luego no se conecta 10 segundos después. Justo después de cambiar el estado para conectar un
[ViceroyTrace] [ICE][ERROR] ICEStopConnectivityCheck() found no ICE check with call id (108154439)
error es arrojado
Si enciendo Wifi y Bluetooth en el dispositivo con iOS 10.1, se descubre el dispositivo con Bluetooth, seguido de una docena
[ViceroyTrace] [ICE][ERROR] Send BINDING_REQUEST failed(C01A0041).
errores y un estado de conexión cambian a no conectado.
Actualización a iOS 10.1.1: aún roto
Actualicé el iPhone de iOS 10.1 a 10.1.1, y los errores aún persisten, sin cambios en absoluto.
Actualización a iOS 10.2.1: ¡parece funcionar!
Después de la actualización de 10.2 (donde todavía estaba roto) a 10.2.1, parece funcionar de nuevo (probado con un dispositivo usando 10.2.1, el otro dispositivo era un antiguo dispositivo iOS 8. Un colega probado con 10.2.1 y 10.2 y extrañamente funcionó también)! La conexión se establece cuando se usa solo Bluetooth (deshabilitando WiFi). Sin embargo, a veces todavía recibo todos los errores ICE y errores de conexión en el registro, PERO no siempre. En este momento traté de reproducirlos y funciona sin advertencias. Extraño, pero la buena noticia es que parece que Apple solucionó el problema.
Usando este código para configurar la conectividad Multipeer en TViOS 10.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
}
}
Informes conectados, pero obtengo estos errores? Ambos dispositivos TViOS y iPhone en la misma red.
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)
Ya probé el código iOS para iOS, funciona perfectamente en el mismo iOS, pero el iPad usa iOS 9.2 -> TViOS 10.0 ¿Veo estos errores?
¡Funciona si reinicio AppleTV con estos errores, pero las conexiones subsiguientes fallan!
En mi aplicación, desarrollo la función: transmitir videos entre dos dispositivos iOS. No puedo transmitir video a otro dispositivo, y recibí el mismo mensaje de registro que tú, y creo que el problema es como decía el registro:
[ERROR] ProcessEvent:1199 Send BINDING_REQUEST failed(C01A0041). [ERROR] ICEStopConnectivityCheck:2688 ICEStopConnectivityCheck() found no ICE check with call id
[ERROR] ProcessEvent:1199 Send BINDING_REQUEST failed(C01A0041). [ERROR] ICEStopConnectivityCheck:2688 ICEStopConnectivityCheck() found no ICE check with call id
Pero después de muchas pruebas de depuración, AVCaptureVideoDataOutputSampleBufferDelegate
que he declarado la function
incorrecta del delegado AVCaptureVideoDataOutputSampleBufferDelegate
. Después de corregir la function
delegado, puedo transmitir video entre dos dispositivos iOS -> tarea Listo
Pero todavía tengo el mismo registro que antes . Entonces, creo que si la característica funciona, podemos ignorar el mensaje de registro o informarlo a Apple. Ya reporté este error a Apple.
Multipeer en iOS 10 es una bolsa de daño. Hice la prueba ayer y parece que solo funcionará si la conexión wifi está activada (solo Bluetooth está roto).
Como alternativa a Multipeer, puede usar el enfoque dns_sd (Bonjour) y crear uno propio. Hice un marco (Pod) que hace exactamente esto (imita a Multipeer). No es multidifusión, no es multidifusión, pero admite roles y solo bluetooth. Más información aquí: https://github.com/xaphod/Bluepeer . Me temo que no he probado con TVOS, por lo que podría necesitar algún trabajo. Se aceptan solicitudes de extracción;)
Obtuve una respuesta de Apple. Parece que puedes ignorar estos mensajes; son un efecto secundario relacionado con los cambios de registro parece?
Mire esto para detalles de los cambios de registro ...
(Si tiene curiosidad sobre este cambio, consulte este video de WWDC 2016: https://developer.apple.com/videos/play/wwdc2016/721/ ).
en mi caso, en lugar de:
_mpcSession = [[MCSession alloc] initWithPeer:self.mpcPeerID];
solía:
_mpcSession = [[MCSession alloc] initWithPeer:self.mpcPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];