2015-11-30 104 views
1

每當我嘗試使用Multipeer Connectivity Framework連接對等體時,對等體的狀態將從MCSessionState.Connecting更改爲MCSessionState.NotConnectedMCSessionState從連接狀態變爲未連接狀態

這裏是我跑的事件順序:

  1. 模擬器通過MCNearbyServiceAdvertiser通告服務。
  2. iPhone通過MCNearbyServiceBrowser瀏覽服務。
  3. iPhone找到模擬器並立即通過invitePeer(_:toSession:withContext:timeout:)邀請它參加 會話。
  4. 最後,模擬器接受使用 advertiser(_:didReceiveInvitationFromPeer:withContext:invitationHandler:)的邀請。

注:

這裏是我使用的代碼:

import UIKit 
import MultipeerConnectivity 

class ViewController: UIViewController { 
    var advertiser: MCNearbyServiceAdvertiser! 
    var browser: MCNearbyServiceBrowser! 
    var session: MCSession! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let localPeerID = MCPeerID(displayName: UIDevice.currentDevice().name) 
     session = MCSession(peer: localPeerID, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.None) 
     session.delegate = self 
    } 

    @IBAction func hostTapped(sender: AnyObject) { 
     let localPeerID = MCPeerID(displayName: UIDevice.currentDevice().name) 
     advertiser = MCNearbyServiceAdvertiser(peer: localPeerID, discoveryInfo: nil, serviceType: "abc") 
     advertiser.delegate = self 
     print("started advertising") 
     advertiser.startAdvertisingPeer() 
    } 

    @IBAction func connectTapped(sender: AnyObject) { 
     let localPeerID = MCPeerID(displayName: UIDevice.currentDevice().name) 
     browser = MCNearbyServiceBrowser(peer: localPeerID, serviceType: "abc") 
     browser.delegate = self 
     print("started searching") 
     browser.startBrowsingForPeers() 
    } 
} 

extension ViewController: MCNearbyServiceAdvertiserDelegate { 
    func advertiser(advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: NSData?, invitationHandler: (Bool, MCSession) -> Void) { 
     print("accepting invitation from \(peerID.displayName)") 
     invitationHandler(true, session) 
    } 

    func advertiser(advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: NSError) { 
     print("did not start advertising \(error)") 
    } 
} 

extension ViewController: MCSessionDelegate { 
    func session(session: MCSession, peer peerID: MCPeerID, didChangeState state: MCSessionState) { 
     print("\(peerID.displayName) changed state: \(state.toString())") 
    } 

    func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID) { 

    } 

    func session(session: MCSession, didReceiveStream stream: NSInputStream, withName streamName: String, fromPeer peerID: MCPeerID) { 

    } 

    func session(session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, withProgress progress: NSProgress) { 

    } 

    func session(session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, atURL localURL: NSURL, withError error: NSError?) { 

    } 

    func session(session: MCSession, didReceiveCertificate certificate: [AnyObject]?, fromPeer peerID: MCPeerID, certificateHandler: (Bool) -> Void) { 
     certificateHandler(true) 
    } 
} 

extension ViewController: MCNearbyServiceBrowserDelegate { 
    func browser(browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) { 
     print("found \(peerID.displayName), inviting to session") 
     browser.invitePeer(peerID, toSession: session, withContext: nil, timeout: 30) 
    } 

    func browser(browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) { 
     print("lost \(peerID.displayName)") 
    } 
} 

extension MCSessionState { 
    func toString() -> String { 
     switch self { 
     case .Connected: return "Connected" 
     case .Connecting: return "Connecting" 
     case .NotConnected: return "Not Connected" 
     } 
    } 
} 

有一個類似question here,然而,鏈接的代碼是舊的,不能再訪問。此外,問題在於正在使用相同的會話對象。

回答

1

我正在爲MCSession,MCNearbyServiceAdvertiser和MCNearbyServiceBrowser使用不同的MCPeerID實例。

爲了解決這個問題,我創建了一個MCPeerID實例變量:

var localPeerID: MCPeerID? 

override func viewDidLoad() { 
    // ... 
    localPeerID = MCPeerID(displayName: UIDevice.currentDevice().name) 
    // ... 
} 

...並使用它,而不是創建爲局部變量(let localPeerID = ...)的。

它現在從連接正確連接狀態。

+0

我遇到了同樣的問題。感謝分享。 –

+0

個人不是解放生產代碼的力量粉絲,除非它真的不能被幫助。這可以通過將其設置爲一個常量並在聲明或惰性加載的初始化時顯着更安全:) –

1

總是可以創建它作爲一個常量的類!

class ViewController: UIViewController { 
    var advertiser: MCNearbyServiceAdvertiser! 
    var browser: MCNearbyServiceBrowser! 
    var session: MCSession! 

    let localPeerID = MCPeerID(displayName: UIDevice.currentDevice().name) 
    ... 
}