Многопользовательское соединение не подключается программно
Я создаю приложение для iOS/macOS, которое использует функции удаленного управления через Multipeer Connectivity Framework. Поскольку устройство, которое будет удаленно отслеживаться и управляться, будет работать в течение длительного периода времени, использование методов контроллера автоматического просмотра нецелесообразно, поскольку устройство мониторинга может быть заблокировано или перейти в спящий режим, а затем отключить соединение. Поэтому я использую программный подход, так что, когда устройства мониторинга теряют соединение, они автоматически соединяются, когда они разблокированы / разбужены, и приложение запускается снова. Мое соединение работает нормально, используя метод ViewController, но не программный подход делегата. Реклама, просмотр и приглашение работает нормально, но когда приглашение принято на удаленной стороне, я получаю несколько ошибок, а затем не удается установить соединение. Что странно, так это то, что некоторые из ошибок являются ошибками GCKSession.
Так почему же он пытается использовать каркас GameCenter? И почему он терпит неудачу после принятия приглашения? Может быть, это просто ошибка в SDK Xier 8 / Swift 3 /iOS 10 / macOS Sierra Beta?
[ViceroyTrace] [ICE][ERROR] ICEStopConnectivityCheck() found no ICE check with call id (2008493930)
[GCKSession] Wrong connection data. Participant ID from remote connection data = 6FBBAE66, local participant ID = 3A4C626C
[MCSession] GCKSessionEstablishConnection failed (FFFFFFFF801A0020)
Peer Changing
Failed
[GCKSession] Not in connected state, so giving up for participant [77B72F6A] on channel [0]
Вот код из моего класса подключения
func startAdvertisingWithoutUI () {
if advertiserService == nil {
advertiserService = MCNearbyServiceAdvertiser (peer: LMConnectivity.peerID, discoveryInfo: nil, serviceType: "mlm-timers")
advertiserService?.delegate = self
session.delegate = self
}
advertiserService?.startAdvertisingPeer()
}
func browserForNearbyDevices () {
if browserService == nil {
browserService = MCNearbyServiceBrowser (peer: LMConnectivity.peerID, serviceType: "mlm-timers")
browserService?.delegate = self
session.delegate = self
}
browserService?.startBrowsingForPeers()
}
func sendInvitation(to peer: MCPeerID) {
browserService?.invitePeer(peer, to: session, withContext: nil, timeout: 60)
}
func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: (Bool, MCSession?) -> Void) {
let trustedNames = GetPreferences.trustedRemoteDevices
for name in trustedNames {
if name == peerID.displayName {
invitationHandler(true,session)
return
}
}
invitationHandler (false, session)
}
6 ответов
Я узнал, что случилось. Объект MCPeerID, который я передавал в экземпляры MCSession, я продавал его как свойство вычисляемого класса вместо того, чтобы хранить его как сохраненное свойство. Поэтому я изменил его на свойство сохраненного экземпляра, и все начало работать! Спасибо Тане за то, что она указала мне в направлении объекта MCPeerID.
Старый код
// Class Properties
static var localPeer : MCPeerID { return MCPeerID(displayName: GetPreferences.deviceName!) }
Новый код
// Instance Properties
let localPeer = MCPeerID (displayName: GetPreferences.deviceName!)
Никто не работал для меня.
Я решил только отключить шифрование...
let session = MCSession(peer:myPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.none)
Когда peerID, используемый для создания сеанса, и peerID, используемый для того, чтобы рекламодатель или браузер не совпадали, я получаю эту часть ошибки.
[GCKSession] Wrong connection data. Participant ID from remote connection data = 6FBBAE66, local participant ID = 3A4C626C
Как только peerIDs совпадают, эта часть ошибки исчезает.
Хотя могут быть и другие проблемы с подключением.
Проблема для меня заключалась в том, что я никогда не назначал делегата MCSession. Я получил все те же сообщения об ошибках, которые упоминал OP, что заставило меня думать, что соединение было разорвано, но на самом деле я просто забыл установить делегата. После установки делегата все сообщения об ошибках все еще печатались, но в противном случае мои методы делегата вызывались нормально при получении сообщения!
Я навлек эту проблему на себя дважды. Надеюсь, это поможет кому-то читать!
Я начал работать с TViOS 10.0 beta с этим...
peerID = MCPeerID(displayName: UIDevice.current.name)
Хотя я все еще вижу эту ошибку...
2016-09-08 10:13:43.016600 PeerCodeATV[208:51135] [ViceroyTrace] [ICE][ERROR] ICEStopConnectivityCheck() found no ICE check with call id (847172408)
2016-09-08 10:13:47.577645 PeerCodeATV[208:51155] [GCKSession] SSLHandshake returned with error [-9819].
Та же самая проблема для меня с приложением, которое я имел в магазине Itunes в течение многих лет. Последнее бета-обновление 10.1 теперь, похоже, исправляет проблему с Bluetooth в моем приложении без каких-либо изменений в моем коде.