![](/img/trans.png)
[英]MultiPeer Connectivity is not working iOS 9.3 Xcode 7.3
[英]Multipeer Connectivity not working after Xcode 11 update
我正在嘗試構建一個基本應用程序,以在附近的 iOS 設備之間使用 Multipeer Connectivity Framework 發送消息。 我嘗試了很多教程,但似乎在 Xcode 11 瀏覽附近的設備並接受請求不像以前那樣工作。
這是我的觀點 controller 和委托方法:
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)
}
}
我在 UI 中添加了 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
),但加入設備從未檢測到托管設備。 控制台中沒有 output 並且沒有錯誤。 加入設備的“正在搜索...”指示器將永遠轉動,而附近沒有任何設備出現。 這可能是什么原因造成的? 我該如何解決? 我正在使用 Xcode 11.0 和 iOS 12 和 13。
似乎MCAdvertiserAssistant
和MCBrowserViewController
沒有針對 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")
分配代表和開始:
advertiser.delegate = self
advertiser.startAdvertisingPeer()
browser.delegate = self
browser.startBrowsingForPeers()
根據我前任的回答,最大的問題似乎是MCAdvertiserAssistant
。 MCBrowserViewController
我來說很好用。
如果您有應該基於MCAdvertiserAssistant
和MCBrowserViewController
運行的代碼,請嘗試將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 似乎存在問題。
當我將其更改為舊的信息 plist 和 AppDelegate 系統時,即使使用新的MCAdvertiserAssistant
和 Swift,它也能正常工作。
附言。 基於最新的 Xcode 11.2 Beta 2
此問題是由UISceneDelegate引起的。 在您選擇退出UISceneDelegate並重建您的項目后,go 應該會很好。
有關如何退出UISceneDelegate的更多信息,請查看帖子: Xcode 11 - 在 iOS 13 上退出 UISceneDelegate/SwiftUI
對於 Xcode 12 和 iOS 14:
也來自 hackingwithSwift 項目 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()
}
並實現這個新方法:我添加了一個 alertViewController 來顯示授權提示,因為當我們進行上述更改時它不會出現。
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 中添加這兩個屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.