【问题标题】:MCAdvertiserAssistant doesn't alert host on connection requestMCAdvertiserAssistant 不会在连接请求时提醒主机
【发布时间】:2020-10-23 09:59:33
【问题描述】:

我正在使用 Swift 5 尝试通过 MultipeerConnectivity 连接设备,但在包括模拟器在内的移动设备上,MCAdvertiserAssistant 无法发挥作用;一旦对等方尝试与 MCBrowser 连接,主机就不会收到“接受或拒绝”警报。但是,当 Mac Catalyst 是主机时,警报显示得很好。这是(相关的)代码:

import MultipeerConnectivity

class Multipeer: UIViewController, MCSessionDelegate, MCBrowserViewControllerDelegate {
    var peerID: MCPeerID!
    var session: MCSession!
    var advertiserAssist: MCAdvertiserAssistant!
    public static var peerData: Data!
    public static var peerDataDecoded: Dictionary<String, Any>!
    public static var userData: Data! = CharacterCreate.userData
    public static var userDataDecoded: Dictionary<String, Any>!
    var currentlyHosting: Bool!
     
    override func viewDidLoad() {
        super.viewDidLoad()
        do {
            Multipeer.userDataDecoded = try JSONSerialization.jsonObject(with: Multipeer.userData, options: .mutableContainers) as? Dictionary<String, Any>
        }
        catch {
            Multipeer.userDataDecoded = ["Not Found": "Not Found"]
        }
        if Multipeer.userDataDecoded["charName"] as? String == "" {
            peerID = MCPeerID(displayName: UIDevice.current.name)
        }
        else {
            peerID = MCPeerID(displayName: Multipeer.userDataDecoded["charName"] as! String)
        }
        session = MCSession(peer: peerID, securityIdentity:  nil, encryptionPreference: .required)
        session.delegate = self
        currentlyHosting = false
        session.disconnect()
    }
    @IBAction func startPressed(_ sender: Any) {
        if session.connectedPeers.count == 0 && !currentlyHosting {
            let startActionSheet = UIAlertController(title: "Start Playing", message: "Would you like to host or join the game?", preferredStyle: .actionSheet)
            startActionSheet.addAction(UIAlertAction(title: "Host (DM)", style: .default, handler: {(action:UIAlertAction) in
                self.advertiserAssist = MCAdvertiserAssistant(serviceType: "connectRequest", discoveryInfo: nil, session: self.session)
                self.advertiserAssist.start()
                self.currentlyHosting = true
            }))
            startActionSheet.addAction(UIAlertAction(title: "Join (Player)", style: .default, handler: {(action:UIAlertAction) in
                let browser = MCBrowserViewController(serviceType: "connectRequest", session: self.session)
                browser.delegate = self
                self.present(browser, animated: true, completion: nil)
            }))
            startActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
            if let popoverPresentationController = startActionSheet.popoverPresentationController {
                popoverPresentationController.sourceView = self.view
                popoverPresentationController.sourceRect = (sender as AnyObject).bounds
            }
            self.present(startActionSheet, animated: true, completion: nil)
        }
        else if session.connectedPeers.count == 0 && currentlyHosting {
            let waitActionSheet = UIAlertController(title: "Searching...", message: "Waiting for players to join...", preferredStyle: .actionSheet)
            waitActionSheet.addAction(UIAlertAction(title: "Stop Connection", style: .destructive, handler: {(action) in
                self.session.disconnect()
                self.currentlyHosting = false
            }))
            waitActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
            if let popoverPresentationController = waitActionSheet.popoverPresentationController {
                popoverPresentationController.sourceView = self.view
                popoverPresentationController.sourceRect = (sender as AnyObject).bounds
            }
            self.present(waitActionSheet, animated: true, completion: nil)
        }
        else {
            let disconnectActionSheet = UIAlertController(title: "Disconnect?", message: "Are you sure you want to disconnect?", preferredStyle: .actionSheet)
            disconnectActionSheet.addAction(UIAlertAction(title: "Stop Connection", style: .destructive, handler: {(action) in
                self.session.disconnect()
                self.currentlyHosting = false
            }))
            disconnectActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
            if let popoverPresentationController = disconnectActionSheet.popoverPresentationController {
                popoverPresentationController.sourceView = self.view
                popoverPresentationController.sourceRect = (sender as AnyObject).bounds
            }
            self.present(disconnectActionSheet, animated: true, completion: nil)
        }
    }
    func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
        DispatchQueue.main.async {
            Multipeer.peerData = data
            do {
                Multipeer.peerDataDecoded = try JSONSerialization.jsonObject(with: Multipeer.peerData, options: .mutableContainers) as? Dictionary<String, Any>
                print(Multipeer.peerDataDecoded!)
                self.present(CharacterRecieved(), animated: true, completion: nil)
            }
            catch {
                Multipeer.peerDataDecoded = ["Not Found": "Not Found"]
            }
        }
    }
    func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
        if !hosting {
            do {
                try session.send(Multipeer.userData, toPeers: session.connectedPeers, with: .reliable)
            }
            catch {
                print("Could not send data to peer")
            }
        }
        browserViewController.dismiss(animated: true, completion: nil)
    }
    func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
        browserViewController.dismiss(animated: true, completion: nil)
    }
}

当前版本的 iOS 有什么问题,还是我做错了什么?我在不同的论坛上看到过类似的问题,但都没有答案。

【问题讨论】:

    标签: ios swift ios-simulator swift5


    【解决方案1】:

    对我来说,答案是停止使用MCAdvertiserAssistant 并改用MCNearbyServiceAdvertiser

    这篇文章帮助了我:hackingwithswift

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2017-08-26
      • 2015-05-08
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多