Многопользовательское соединение не подключается программно

Я создаю приложение для 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 в моем приложении без каких-либо изменений в моем коде.

Другие вопросы по тегам