2015-11-30 117 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) 
    ... 
}