Xcode 11更新后,Multipeer连接不起作用

问题描述 投票:1回答:2

我正在尝试构建一个基本应用程序,以使用Multipeer Connectivity Framework在附近的iOS设备之间发送消息。我已经尝试了许多教程,但是似乎在Xcode 11中浏览附近的设备并不能像以前那样接受请求。

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

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),但是加入设备从未检测到托管设备。控制台中没有输出,也没有错误。加入设备的“正在搜索...”指示灯将永远亮起,而附近的任何设备都不会出现。是什么原因造成的?我该如何解决?我正在使用Xcode 11.0和iOS 12和13。

ios swift multipeer-connectivity
2个回答
1
投票

[iOS和Swift的最新版本似乎MCAdvertiserAssistantMCBrowserViewController没有更新,因此它们无法正常工作。

我通过使用MCNearbyServiceAdvertiser而不是MCAdvertiserAssistantMCNearbyServiceBrowser而不是MCBrowserViewController来解决。请注意,通过使用这些类,您需要自己执行基本操作,例如列出已创建的设备,显示和处理邀请警报等。

您可以如下使用这些类。

定义:

 var advertiser: MCNearbyServiceAdvertiser!
 var browser: MCNearbyServiceBrowser!

初始化:

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

分配代表并开始:

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

0
投票

根据我前任的回答,最大的问题似乎是MCAdvertiserAssistantMCBrowserViewController对我有效。

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

因此,这就是您需要的一切,例如,如果您在Paul Hudson的Swift的100天中从事Project 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似乎是一个问题。

当我将其更改为旧的信息列表时,即使使用新的Xcode和Swift,AppDelegate系统MCAdvertiserAssistant也可以正常工作。

ps。基于最新的Xcode 11.2 Beta 2

© www.soinside.com 2019 - 2024. All rights reserved.