簡體   English   中英

MultiPeer Connectivity 不工作 iOS 9.3 Xcode 7.3

[英]MultiPeer Connectivity is not working iOS 9.3 Xcode 7.3

我一直在使用此代碼來建立正確的連接。 我已經嘗試過 iPhone 模擬器和物理設備。 我無法正確連接它。 因為它顯示它的狀態為“正在連接...”,然后直接進入“未連接”狀態。 我已經探索了很多,並沒有發現任何有用的東西可以解決這個問題。 此外,我在 Apple Developer Forum 中閱讀了一些問題,很多人都遇到過同樣的問題。 但目前還沒有合適的解決方案。 請檢查代碼。 並提前致謝。

import UIKit
import MultipeerConnectivity

//MARK: MCNearbyServiceAdvertiserDelegate

extension ViewController : MCNearbyServiceAdvertiserDelegate
{
    // Incoming invitation request.  Call the invitationHandler block with YES
    // and a valid session to connect the inviting peer to the session.

    func advertiser(advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: NSData?, invitationHandler: (Bool, MCSession) -> Void)
    {
        invitationHandler(true, self.session) // Accepting an invitation
        //  self.serviceBrowser.stopBrowsingForPeers()
    }

    // Advertising did not start due to an error.

    func advertiser(advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: NSError)
    {
        print("\(error.localizedDescription)")
    }
}

//MARK: MCNearbyServiceBrowserDelegate

extension ViewController : MCNearbyServiceBrowserDelegate
{
    // Found a nearby advertising peer.

    func browser(browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?)
    {
        browser.invitePeer(peerID, toSession: self.session, withContext: nil, timeout: 10) // Inviting a peer to connect to my session
        // self.serviceAdvertiser.stopAdvertisingPeer()
    }

    // A nearby peer has stopped advertising.

    func browser(browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID)
    {
        print("Lost")
    }

    // Browsing did not start due to an error.

    func browser(browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: NSError)
    {
        print("\(error.localizedDescription)")
    }
}

//MARK: MCSessionDelegate

extension ViewController : MCSessionDelegate
{
    // Remote peer changed state.

    func session(session: MCSession, peer peerID: MCPeerID, didChangeState 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)")
        }
    }

    // Received data from remote peer.

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

            let str = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
            print("Value recieved : \(str)")
        }

    }

    // Received a byte stream from remote peer.

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

    }

    // Start receiving a resource from remote peer.

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

    }

    // Finished receiving a resource from remote peer and saved the content
    // in a temporary location - the app is responsible for moving the file
    // to a permanent location within its sandbox.

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

    }

    // Made first contact with peer and have identity information about the
    // remote peer (certificate may be nil).

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

    }
}

//MARK: ViewController

class ViewController: UIViewController {

    // View Did Load

    override func viewDidLoad() {
        super.viewDidLoad()

        self.start()
    }

    // User clicked on a button, send value alvin to all connected devices

    @IBAction func helloclicked(sender: UIButton)
    {
        self.sendValuesToPeer("alvin")
    }


    private enum EHRServiceType : String
    {
        case Update = "HelloUpdate"
    }

    var myOwnPeerId : MCPeerID!

    // Browser

    var advertiserAssistant : MCAdvertiserAssistant!

    // For finding the devices

    var serviceAdvertiser : MCNearbyServiceAdvertiser!

    // For listening to devices

    var serviceBrowser : MCNearbyServiceBrowser!

    // Session

    // var session : MCSession!

    lazy var session : MCSession = {

            let session = MCSession(peer: self.myOwnPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.Optional)
            session.delegate = self
            return session

    }()

    func start() {

        self.myOwnPeerId = MCPeerID(displayName: "Alvin \(UIDevice.currentDevice().name)")

        // Advertising

        self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: self.myOwnPeerId, discoveryInfo: nil, serviceType: EHRServiceType.Update.rawValue)

        // Browsing

        self.serviceBrowser = MCNearbyServiceBrowser(peer: self.myOwnPeerId, serviceType: EHRServiceType.Update.rawValue)

        self.advertiserAssistant = MCAdvertiserAssistant(serviceType: EHRServiceType.Update.rawValue, discoveryInfo: nil, session: self.session)

        // Session

        // self.session = MCSession(peer: self.myOwnPeerId, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.Required)

        // Session

        // self.session.delegate = self

        // Browsing

        self.serviceBrowser.delegate = self
        self.serviceBrowser.startBrowsingForPeers() // Starting browsing...

        // Avertising

        self.serviceAdvertiser.delegate = self
        self.serviceAdvertiser.startAdvertisingPeer() // Starting advertising...

        self.advertiserAssistant.start()

    }

    override func viewDidAppear(animated: Bool) {

        // let browser = MCBrowserViewController(browser: self.serviceBrowser, session: self.session)

        // self.presentViewController(browser, animated: true, completion: nil)
    }

    //MARK: Send values to peer

    func sendValuesToPeer(name : String)
    {
        if self.session.connectedPeers.count > 0
        {
            let value =  name.dataUsingEncoding(NSUTF8StringEncoding)

            do
            {
                try self.session.sendData(value!, toPeers: self.session.connectedPeers, withMode: MCSessionSendDataMode.Reliable)
            }
            catch
            {

            }

        }
        else
        {
            print("No peers")
        }
    }
}

我也嘗試過很多情況,比如不加密,加密,具有相同的項目目標(在兩台計算機上使用 iPhone 模擬器時),通過在找到設備時停止廣告,在發送邀請時停止瀏覽。 但是這些替代方案都沒有解決我的問題,它仍然在“正在連接...”中,直接轉到“未連接”。 請讓我知道你的想法。

首先檢查您是否在同一個wifi網絡中。

但不要忘記 bulutooth 在模擬器中不起作用。

此外,設備和模擬器完全沒問題。 我正在使用乘數幾個月。 我注意到連接 - 只有當兩個設備/對等點都在不同的 wifi/藍牙網絡中時才處於斷開狀態。

如果這些都OK。 然后

閱讀此內容並獲取示例項目

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM