ios - MultipeerConnectivity 拒绝连接
问题描述
我正在尝试在两个设备之间建立蓝牙连接,这是我的代码:
var peerID: MCPeerID!
var mcSession: MCSession!
var mcAdvertiserAssistant: MCAdvertiserAssistant!
@IBAction func connectBlueTooth(_ sender: Any) {
let actionSheet = UIAlertController(title: "משחק רשת", message: "מעוניין ליצור משחק חדש או להצטרף למשחק קיים?", preferredStyle: .actionSheet)
actionSheet.addAction(UIAlertAction(title: "יצירת משחק חדש", style: .default, handler: {
(action: UIAlertAction) in
self.startHosting()
}))
actionSheet.addAction(UIAlertAction(title: "חיפוש משחק קיים", style: .default, handler: {
(action: UIAlertAction) in
self.joinSession()
}))
actionSheet.addAction(UIAlertAction(title: "ביטול", style: .default, handler: nil))
if let popoverController = actionSheet.popoverPresentationController {
popoverController.sourceView = self.view
let constraintValue = AppConfigurator.getConstraintByDevice()
popoverController.sourceRect = CGRect(x: self.view.bounds.maxX - constraintValue, y: self.view.bounds.maxY - (3.5 * constraintValue), width: 0, height: 0)
popoverController.permittedArrowDirections = []
}
self.present(actionSheet, animated: true, completion: nil)
}
和扩展:
extension MainMenuVC: MCBrowserViewControllerDelegate {
func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
dismiss(animated: true, completion: nil)
}
func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
dismiss(animated: true, completion: nil)
}
}
extension MainMenuVC: MCSessionDelegate {
func startHosting() {
mcAdvertiserAssistant = MCAdvertiserAssistant(serviceType: "CatchTheDragon", discoveryInfo: nil, session: mcSession)
mcAdvertiserAssistant.start()
}
func joinSession() {
let mcBrowser = MCBrowserViewController(serviceType: "CatchTheDragon", session: mcSession)
mcBrowser.delegate = self
present(mcBrowser, animated: true)
}
func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
switch state {
case MCSessionState.connected:
print("Connected: \(peerID.displayName)")
case MCSessionState.connecting:
print("Connecting: \(peerID.displayName)")
case MCSessionState.notConnected:
print("Not Connected: \(peerID.displayName)")
}
}
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
let userInfo = ["data" : data, "peerID": peerID] as [String : Any]
DispatchQueue.main.async {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "WPC_DidReceiveDataNotification"), object: nil, userInfo: userInfo)
}
}
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?) {}
}
由于某种原因,设备陷入“连接”状态,最终解决为“拒绝”状态。我不喜欢使用MCNearbyServiceAdvertiserDelegate
and MCNearbyServiceBrowser
。我在这里想念什么?
解决方案
我遇到了同样的问题,但我发现以下文章进行了修复:“Swift 中的 Multipeer Сonnectivity Framework:教程”
无法收到从另一台设备加入会话的提醒?
嗯,这是 XCode 11.2 和 iOS 13 中出现并且仍然存在的常见问题。我们不知道 Apple 是否发现该框架已过时或稍后会修复它。一种解决方案可以是——从使用 SceneDelegate 和 AppDelegate 降级到只使用一个类:AppDelegate 并为未来的应用程序使用 UIScene,而不是这个。
- 首先,从 Info.plist 中彻底删除“Application Scene Manifest”条目;
- 移除 SceneDelegate 类,并移除 AppDelegate 中所有与场景相关的方法;
- 如果缺少,请添加属性 var window: UIWindow? 到您的 AppDelegate 类。
您的应用现在应该只使用应用委托,并且在 iOS 13 下,它将具有与 iOS 12 相同的生命周期。Multipeer 连接应该按照最初的设计工作。
推荐阅读
- python - 在 Pytorch 中使用加载文本数据时出现断管错误
- windows - 通过命令提示符通过 bash 调用 ffmpeg
- react-router - 页面刷新后路由查询丢失 [nextjs]
- visual-studio-code - VS Code 开发容器:无法下载 VS Code Server
- c++ - 检查一个类是否有基础
- sql - MS Access:我如何找到最近日期只有“工作”或“恢复”状态的员工?
- javascript - 每个浏览器页面多个网络摄像头
- android - BottomNavigationView 切换标签页显示旧片段
- node.js - Mongoose CastError:模型“Task”的路径“_listId”的值“:listId”转换为ObjectId失败
- swift - 无法同时满足约束。使用 UICollectionViewFlowLayout 自适应单元格高度