簡體   English   中英

Xcode 11 更新后多點連接不工作

[英]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。

似乎MCAdvertiserAssistantMCBrowserViewController沒有針對 iOS 和 Swift 的最新版本進行更新,因此它們無法正常工作。

我通過使用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()

根據我前任的回答,最大的問題似乎是MCAdvertiserAssistant MCBrowserViewController我來說很好用。

如果您有應該基於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 似乎存在問題。

當我將其更改為舊的信息 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 中添加這兩個屬性。

  1. 隱私 - 本地網絡使用說明:“您的消息”
  2. Bonjour 服務:_yourServiceTypeName._tcp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM