Ios XCode Swift-MultiPeerConnectivity/McAdvertiseAssistant未显示连接的接受/拒绝对话

Ios XCode Swift-MultiPeerConnectivity/McAdvertiseAssistant未显示连接的接受/拒绝对话,ios,swift,xcode,Ios,Swift,Xcode,目前正在尝试使多点连接正常工作。当前的问题是会话主机。加入会话的视图控制器工作正常,因为它显示主机的名称并允许我尝试连接,但是没有在主机设备上显示接受或拒绝的对话框,什么也没有发生,等待几秒钟后,尝试加入会话的设备超时,并显示主机已拒绝。我不明白我可能做错了什么,下面代码的相关部分 查看加入会话的控制器: import MultipeerConnectivity class DisplayActualViewController: UIViewController, MCSessionDele

目前正在尝试使多点连接正常工作。当前的问题是会话主机。加入会话的视图控制器工作正常,因为它显示主机的名称并允许我尝试连接,但是没有在主机设备上显示接受或拒绝的对话框,什么也没有发生,等待几秒钟后,尝试加入会话的设备超时,并显示主机已拒绝。我不明白我可能做错了什么,下面代码的相关部分

查看加入会话的控制器:

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)")
        }
    }
查看承载会话的控制器:

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)")
        }
    }
这对我很有用:

从使用SceneDelegate降级,不要使用UIScene

  • 从Info.plist中完全删除“应用程序场景清单”条目

  • 移除SceneDelegate类,并移除AppDelegate中与场景相关的方法

  • 将“var窗口:UIWindow?”添加到AppDelegate类


iOS 13下的应用程序将具有与iOS 12相同的生命周期。而且,多电话连接应该按照最初设计的方式工作。

不会显示用于接受邀请的MCAdvertiseAssistant警报。因此,邀请超时,您会收到拒绝的回复

您可以通过将McAdvertiseAssistant替换为MCNearbyServiceAdvertiser来解决此问题

以下是一种通过3个步骤实现的方法:

  • 将“mcAdvertiserAssistant”属性替换为:
  • var mcNearbyServiceAdvertiser:mcNearbyServiceAdvertiser!
    
  • 将“startHosting()”方法更改为:
  • func startHosting(){
    mcnearbyservicecadvertiser=mcnearbyservicecadvertiser(对等方:peerID,discoveryInfo:nil,服务类型:“硬件测试”)
    mcNearbyServiceAdvertiser.delegate=self
    mcNearbyServiceAdvertiser.startAdvertisingPeer()
    }
    
  • 使用以下方法使“CounterViewController”类符合MCNearbyServiceAdvertiserDelegate
  • func广告商(\uAdvertiser:mcnearbyservicecavertiser,direceiveinvitationfrompeer peerID:mcpeerind,上下文:Data?,invitationHandler:@escaping(Bool,MCSession?->Void){
    让appName=Bundle.main.infoDictionary?[“CbundLename”]作为?字符串??“收到邀请”
    让ac=UIAlertController(标题:appName,消息:“\(peerID.displayName)”想要连接。”,首选样式:。警报)
    让declineAction=UIAlertAction(标题:“拒绝”,样式:。取消){[weak self]\uUin invitationHandler(false,self?.mcSession)}
    让acceptAction=UIAlertAction(标题:“Accept”,样式:。默认值){[weak self]\uUin invitationHandler(true,self?.mcSession)}
    ac.addAction(去线性化)
    ac.addAction(验收)
    当前(ac,动画:真)
    }