[英]MultipeerConnectivity declining connection
我正在嘗試在兩個設備之間建立藍牙連接,這是我的代碼:
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?) {}
}
由於某種原因,設備卡在“連接”state 中,最終在“拒絕”state 中解決。 我不喜歡使用MCNearbyServiceAdvertiserDelegate
和MCNearbyServiceBrowser
。 我在這里想念什么?
我遇到了同樣的問題,但我發現以下文章進行了修復: “Swift 中的多點連接框架:教程”
無法提醒從另一台設備加入 session?
嗯,這是出現在 XCode 11.2 和 iOS 13 中的常見問題,並且仍然存在。 我們不知道 Apple 是否發現該框架已過時或稍后會修復它。 一種解決方案可以是 -從使用 SceneDelegate 和 AppDelegate 降級到僅一個 class:AppDelegate 並為未來的應用程序使用 UIScene ,而不是這個。
- 首先,從 Info.plist 中徹底刪除“Application Scene Manifest”條目;
- 刪除 SceneDelegate class,並刪除 AppDelegate 中所有與場景相關的方法;
- 如果缺少,請添加屬性 var window: UIWindow? 到您的 AppDelegate class。
您的應用現在應該只使用應用委托,並且在 iOS 13 下,它將具有與 iOS 12 相同的生命周期。多點連接應該按照最初的設計工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.