【发布时间】:2020-10-23 09:59:33
【问题描述】:
我正在使用 Swift 5 尝试通过 MultipeerConnectivity 连接设备,但在包括模拟器在内的移动设备上,MCAdvertiserAssistant 无法发挥作用;一旦对等方尝试与 MCBrowser 连接,主机就不会收到“接受或拒绝”警报。但是,当 Mac Catalyst 是主机时,警报显示得很好。这是(相关的)代码:
import MultipeerConnectivity
class Multipeer: UIViewController, MCSessionDelegate, MCBrowserViewControllerDelegate {
var peerID: MCPeerID!
var session: MCSession!
var advertiserAssist: MCAdvertiserAssistant!
public static var peerData: Data!
public static var peerDataDecoded: Dictionary<String, Any>!
public static var userData: Data! = CharacterCreate.userData
public static var userDataDecoded: Dictionary<String, Any>!
var currentlyHosting: Bool!
override func viewDidLoad() {
super.viewDidLoad()
do {
Multipeer.userDataDecoded = try JSONSerialization.jsonObject(with: Multipeer.userData, options: .mutableContainers) as? Dictionary<String, Any>
}
catch {
Multipeer.userDataDecoded = ["Not Found": "Not Found"]
}
if Multipeer.userDataDecoded["charName"] as? String == "" {
peerID = MCPeerID(displayName: UIDevice.current.name)
}
else {
peerID = MCPeerID(displayName: Multipeer.userDataDecoded["charName"] as! String)
}
session = MCSession(peer: peerID, securityIdentity: nil, encryptionPreference: .required)
session.delegate = self
currentlyHosting = false
session.disconnect()
}
@IBAction func startPressed(_ sender: Any) {
if session.connectedPeers.count == 0 && !currentlyHosting {
let startActionSheet = UIAlertController(title: "Start Playing", message: "Would you like to host or join the game?", preferredStyle: .actionSheet)
startActionSheet.addAction(UIAlertAction(title: "Host (DM)", style: .default, handler: {(action:UIAlertAction) in
self.advertiserAssist = MCAdvertiserAssistant(serviceType: "connectRequest", discoveryInfo: nil, session: self.session)
self.advertiserAssist.start()
self.currentlyHosting = true
}))
startActionSheet.addAction(UIAlertAction(title: "Join (Player)", style: .default, handler: {(action:UIAlertAction) in
let browser = MCBrowserViewController(serviceType: "connectRequest", session: self.session)
browser.delegate = self
self.present(browser, animated: true, completion: nil)
}))
startActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
if let popoverPresentationController = startActionSheet.popoverPresentationController {
popoverPresentationController.sourceView = self.view
popoverPresentationController.sourceRect = (sender as AnyObject).bounds
}
self.present(startActionSheet, animated: true, completion: nil)
}
else if session.connectedPeers.count == 0 && currentlyHosting {
let waitActionSheet = UIAlertController(title: "Searching...", message: "Waiting for players to join...", preferredStyle: .actionSheet)
waitActionSheet.addAction(UIAlertAction(title: "Stop Connection", style: .destructive, handler: {(action) in
self.session.disconnect()
self.currentlyHosting = false
}))
waitActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
if let popoverPresentationController = waitActionSheet.popoverPresentationController {
popoverPresentationController.sourceView = self.view
popoverPresentationController.sourceRect = (sender as AnyObject).bounds
}
self.present(waitActionSheet, animated: true, completion: nil)
}
else {
let disconnectActionSheet = UIAlertController(title: "Disconnect?", message: "Are you sure you want to disconnect?", preferredStyle: .actionSheet)
disconnectActionSheet.addAction(UIAlertAction(title: "Stop Connection", style: .destructive, handler: {(action) in
self.session.disconnect()
self.currentlyHosting = false
}))
disconnectActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
if let popoverPresentationController = disconnectActionSheet.popoverPresentationController {
popoverPresentationController.sourceView = self.view
popoverPresentationController.sourceRect = (sender as AnyObject).bounds
}
self.present(disconnectActionSheet, animated: true, completion: nil)
}
}
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
DispatchQueue.main.async {
Multipeer.peerData = data
do {
Multipeer.peerDataDecoded = try JSONSerialization.jsonObject(with: Multipeer.peerData, options: .mutableContainers) as? Dictionary<String, Any>
print(Multipeer.peerDataDecoded!)
self.present(CharacterRecieved(), animated: true, completion: nil)
}
catch {
Multipeer.peerDataDecoded = ["Not Found": "Not Found"]
}
}
}
func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
if !hosting {
do {
try session.send(Multipeer.userData, toPeers: session.connectedPeers, with: .reliable)
}
catch {
print("Could not send data to peer")
}
}
browserViewController.dismiss(animated: true, completion: nil)
}
func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
browserViewController.dismiss(animated: true, completion: nil)
}
}
当前版本的 iOS 有什么问题,还是我做错了什么?我在不同的论坛上看到过类似的问题,但都没有答案。
【问题讨论】:
标签: ios swift ios-simulator swift5