Xcode 11更新后多点连接无法正常工作

bejyjqdl  于 2022-10-04  发布在  Swift
关注(0)|答案(5)|浏览(157)

我正在尝试构建一个基本的应用程序,以便使用多点连接框架在附近的iOS设备之间发送消息。我尝试了许多教程,但在Xcode11中,浏览附近的设备和接受请求似乎不像以前那样有效。

以下是我的视图控制器和委托方法:

import UIKit
import MultipeerConnectivity

class ViewController: UIViewController,MCSessionDelegate,MCBrowserViewControllerDelegate {

var peerID: MCPeerID?
var session: MCSession?

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

func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
    switch state {
    case .connected: print("Connected to (peerID.displayName)")
    case .connecting: print("Connecting: (peerID.displayName)")
    case .notConnected: print("Not Connected: (peerID.displayName)")
    default: print("")
    }
}

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

}

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) {
    browserViewController.dismiss(animated: true, completion: nil)
}

func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
    browserViewController.dismiss(animated: true, completion: nil)
}

}

我已经在用户界面中添加了2个按钮,一个用于托管,另一个用于加入。以下是方法:

@IBAction func hostBtnTapped(_ sender: Any) {
    hostSession()
}

@IBAction func joinBtnTapped(_ sender: Any) {
    joinSession()
}

他们打来电话:

func hostSession() {
    let advertiser = MCAdvertiserAssistant(serviceType: "mg-testing", discoveryInfo: nil, session: session!)
    advertiser.start()
}
func joinSession() {
    let browser = MCBrowserViewController(serviceType: "mg-testing", session: session!)
    browser.delegate = self
    self.present(browser, animated: true, completion: nil)
}

当我编译并运行它时,一切看起来都很好。我在第一台设备上点击“主机”,在第二台设备上进入“加入”模式(显示MCBrowserViewController),但加入的设备从未检测到托管设备。控制台中没有输出,也没有错误。加入设备的“搜索...”指示灯永远转动,没有任何附近的设备出现。这可能是什么原因造成的?我怎么才能解决它呢?我使用的是Xcode11.0和iOS 12&13。

pw136qt2

pw136qt21#

MCAdvertiserAssistantMCBrowserViewController似乎没有针对iOS和SWIFT的最新版本进行更新,因此它们无法正常工作。

我用MCNearbyServiceAdvertiser代替MCAdvertiserAssistant,用MCNearbyServiceBrowser代替MCBrowserViewController解决了这个问题。请注意,通过使用这些类,您将需要自己执行基本操作,如列出创建的设备、显示和处理邀请警报。等。

您可以使用这些类,如下所示。

定义:

var advertiser: MCNearbyServiceAdvertiser!
 var browser: MCNearbyServiceBrowser!

初始化:

advertiser = MCNearbyServiceAdvertiser(peer: peerID, discoveryInfo: nil, serviceType: "my-test")
browser = MCNearbyServiceBrowser(peer: peerID, serviceType: "my-test")

分配代表(&S):

advertiser.delegate = self
advertiser.startAdvertisingPeer()
browser.delegate = self
browser.startBrowsingForPeers()
b91juud3

b91juud32#

根据我的前任的回答,最大的问题似乎是MCAdvertiserAssistantMCBrowserViewController对我来说很好。

如果您的代码应该基于MCAdvertiserAssistantMCBrowserViewController运行,请尝试将MCAdvertiserAssistant替换为MCNearbyServiceAdvertiser

所以这就是你需要的一切,如果你在保罗·哈德森的《斯威夫特100天中的第25号项目》中工作。(当我不得不为这个问题找到解决方案时,我就这么做了)

var advertiser: MCNearbyServiceAdvertiser!
advertiser = MCNearbyServiceAdvertiser(peer: peerID, discoveryInfo: nil, serviceType: "my-test")
advertiser.delegate = self
advertiser.startAdvertisingPeer()

MCNearbyServiceAdvertiserDelegate添加到您的协议列表并实现委托方法:

func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
        invitationHandler(true, mcSession)
    }

这只会接受所有的连接,但也足够了,所以它应该会起作用。

进一步调查:新的Xcode模板和info.plist中的新UIApplicationSceneManifest以及支持多窗口的新SceneDelegate似乎有问题。

当我把它改为旧的Info plist和AppDelegate系统时,MCAdvertiserAssistant即使在新的Xcode和Swift上也能正常工作。

PS.基于最新的Xcode 11.2 Beta 2

2w2cym1i

2w2cym1i3#

这个问题是由UISceneDelegate引起的。在您选择退出UISceneDelegate并重新构建您的项目之后,应该是很好的选择。

有关如何退出UISceneDelegate的更多信息,请查看帖子:Xcode 11 - Opt out of UISceneDelegate/SwiftUI on iOS 13

pb3skfrl

pb3skfrl4#

对于Xcode 12和iOS 14:

来自Swift Project 25的黑客攻击,我花了2个小时来比较代码:(最终,我认为这是Xcode版本或iOS版本的问题。

要修复此问题,请首先将MCAdvertiserAssistant替换为MCNearbyServiceAdvertiser

修改startHosting方法如下:

func startHosting(action: UIAlertAction) {
        advertiser = MCNearbyServiceAdvertiser(peer: peerID, discoveryInfo: nil, serviceType: "hws-project25")
        advertiser.delegate = self
        advertiser.startAdvertisingPeer()
    }

**并实现这个新方法:**我添加了一个警示视图控制器来显示授权提示,因为当我们做上述更改时,它不会出现。

func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
        let ac = UIAlertController(title: "Project25", message: "'(peerID.displayName)' wants to connect", preferredStyle: .alert)
        ac.addAction(UIAlertAction(title: "Accept", style: .default, handler: { [weak self] _ in
            invitationHandler(true, self?.mcSession)
        }))
        ac.addAction(UIAlertAction(title: "Decline", style: .cancel, handler: { _ in
            invitationHandler(false, nil)
        }))
        present(ac, animated: true)
    }

还有一件事:

对于iOS 14,如果您想要使用多点连接,也需要在info.plist中添加这两个属性。

1.隐私-本地网络使用说明:“您的消息”
1.Bonjour服务:_youServiceTypeName._tcp

o8x7eapl

o8x7eapl5#

MCAdvertiserAssistantMCBrowserViewController没有被弃用,即使在iOS 16(Xcode 14)中也可以正常工作。但是,如另一个答案中所述,需要在info.plist中添加两个条目:

1.隐私-本地网络使用描述:您的消息
1.Bonjour服务:_youServiceTypeName._tcp

如果没有这些条目,您将无法在连接浏览器中看到第二台设备。

相关问题