Muh*_*Gül 5 ios multipeer-connectivity swift
我正在尝试构建一个基本应用程序,以使用 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)
}
}
Run Code Online (Sandbox Code Playgroud)
我在 UI 中添加了 2 个按钮,一个用于托管,另一个用于加入。以下是方法:
@IBAction func hostBtnTapped(_ sender: Any) {
hostSession()
}
@IBAction func joinBtnTapped(_ sender: Any) {
joinSession()
}
Run Code Online (Sandbox Code Playgroud)
他们称:
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)
}
Run Code Online (Sandbox Code Playgroud)
当我编译并运行它时,一切看起来都很好。我在我的第一台设备上单击“主机”并在我的第二台设备中进入“加入”模式(MCBrowserViewController显示出来),但加入的设备从未检测到托管设备。控制台中没有输出,也没有错误。加入设备的“正在搜索...”指示器永远不会显示任何附近的设备。这可能是什么原因造成的?我该如何解决?我使用的是 Xcode 11.0 和 iOS 12 & 13。
它似乎MCAdvertiserAssistant并MCBrowserViewController没有针对最新版本的 iOS 和 Swift 进行更新,因此它们无法正常工作。
我通过使用MCNearbyServiceAdvertiser代替MCAdvertiserAssistant和MCNearbyServiceBrowser代替MCBrowserViewController. 请注意,通过使用这些类,您需要自己执行基本操作,例如列出已建立的设备、显示和处理邀请警报等。
您可以使用这些类,如下所示。
定义:
var advertiser: MCNearbyServiceAdvertiser!
var browser: MCNearbyServiceBrowser!
Run Code Online (Sandbox Code Playgroud)
初始化:
advertiser = MCNearbyServiceAdvertiser(peer: peerID, discoveryInfo: nil, serviceType: "my-test")
browser = MCNearbyServiceBrowser(peer: peerID, serviceType: "my-test")
Run Code Online (Sandbox Code Playgroud)
分配代表和开始:
advertiser.delegate = self
advertiser.startAdvertisingPeer()
browser.delegate = self
browser.startBrowsingForPeers()
Run Code Online (Sandbox Code Playgroud)
小智 9
根据我前任的回答,最大的问题似乎是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()
Run Code Online (Sandbox Code Playgroud)
添加MCNearbyServiceAdvertiserDelegate到您的协议列表并实现委托方法:
func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
invitationHandler(true, mcSession)
}
Run Code Online (Sandbox Code Playgroud)
这只会接受每个连接,但这也足够了,所以它应该可以工作。
进一步调查:新的 Xcode 模板和UIApplicationSceneManifestinfo.plist 中的新模板以及用于多窗口支持的新 SceneDelegate似乎存在问题。
当我将其更改为旧的 info plist 时,MCAdvertiserAssistant即使使用新的 Xcode 和 Swift ,AppDelegate 系统也能正常工作。
附:基于最新的 Xcode 11.2 Beta 2
| 归档时间: |
|
| 查看次数: |
2313 次 |
| 最近记录: |