XCode Swift - MultiPeerConnectivity / MCAdvertiserAssistant не отображает диалог принятия / отклонения для подключений - PullRequest
1 голос
/ 20 июня 2020

В данный момент пытаюсь заставить MultiPeerConnectivity работать. Текущая проблема связана с хостом сеанса. Контроллер представления, который присоединяется к сеансу, работает правильно, так как он показывает имя хоста и позволяет мне попытаться подключиться, однако вместо появления диалога для принятия или отклонения на хост-устройстве ничего не происходит, и через несколько секунд ожидания, время ожидания устройства, пытающегося присоединиться к сеансу, истекает и показывает, что узел отказался. Я не понимаю, что я делаю неправильно, соответствующую часть приведенного ниже кода.

Контроллер представления присоединяется к сеансу:

import MultipeerConnectivity

class DisplayActualViewController: UIViewController, MCSessionDelegate, MCBrowserViewControllerDelegate {
    
    var peerID: MCPeerID!
    var mcSession: MCSession!
    var mcAdvertiserAssistant: MCAdvertiserAssistant!

    override func viewDidLoad() {
        super.viewDidLoad()
        peerID = MCPeerID(displayName: UIDevice.current.name)
        mcSession = MCSession(peer: peerID, securityIdentity: nil, encryptionPreference: .required)
        mcSession.delegate = self
    }

    func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {

    }

    func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {

    }

    func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {

    }

    func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
        dismiss(animated: true)
    }

    func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
        dismiss(animated: true)
    }
    
    func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
        switch state {
        case MCSessionState.connected:
            print("Connected: \(peerID.displayName)")

        case MCSessionState.connecting:
            print("Connecting: \(peerID.displayName)")

        case MCSessionState.notConnected:
            print("Not Connected: \(peerID.displayName)")
        }
    }

    func joinSession() {
        let mcBrowser = MCBrowserViewController(serviceType: "hws-testing", session: mcSession)
        mcBrowser.delegate = self
        present(mcBrowser, animated: true)
    }

Контроллер представления, на котором размещен сеанс:

import MultipeerConnectivity

class CounterViewController: UIViewController, MCSessionDelegate, MCBrowserViewControllerDelegate {
    var peerID = MCPeerID(displayName: UIDevice.current.name)
    var mcSession: MCSession!
    var mcAdvertiserAssistant: MCAdvertiserAssistant!

    override func viewDidLoad() {
        super.viewDidLoad()
        mcSession = MCSession(peer: peerID, securityIdentity: nil, encryptionPreference: .required)
        mcSession.delegate = self
        startHosting()
    }

    func startHosting() {
        mcAdvertiserAssistant = MCAdvertiserAssistant(serviceType: "hws-testing", discoveryInfo: nil, session: mcSession)
        mcAdvertiserAssistant.start()
    }

    func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {

    }

    func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {

    }

    func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {

    }
    
    func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
        
    }

    func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
        dismiss(animated: true)
    }

    func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
        dismiss(animated: true)
    }
    func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
        switch state {
        case MCSessionState.connected:
            print("Connected: \(peerID.displayName)")

        case MCSessionState.connecting:
            print("Connecting: \(peerID.displayName)")

        case MCSessionState.notConnected:
            print("Not Connected: \(peerID.displayName)")
        }
    }

1 Ответ

0 голосов
/ 03 июля 2020

Это сработало для меня:

Перейти на более раннюю версию с использованием SceneDelegate и не использовать UIScene.

  • Полностью удалите запись «Application Scene Manifest» из Info.plist

  • Удалите класс SceneDelegate и удалите связанные со сценой методы в AppDelegate

  • Добавьте 'var window: UIWindow?' в свой класс AppDelegate.

Ваше приложение под iOS 13 будет иметь тот же жизненный цикл, что и iOS 12. А многопользовательское соединение должно работать так, как оно было изначально спроектировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...