简体   繁体   English

MultiPeer Connectivity 不工作 iOS 9.3 Xcode 7.3

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

I have been using this code to establish a proper connection.我一直在使用此代码来建立正确的连接。 I have tried both iPhone Simulator and Physical Device.我已经尝试过 iPhone 模拟器和物理设备。 I could not connect it properly.我无法正确连接它。 As in it shows its state as "Connecting..." and just directly goes to "Not Connected" state.因为它显示它的状态为“正在连接...”,然后直接进入“未连接”状态。 I have explored a lot, and didn't find anything useful which would solve this issue.我已经探索了很多,并没有发现任何有用的东西可以解决这个问题。 Also i read some questions in Apple Developer Forum that so many people have faced the same issue.此外,我在 Apple Developer Forum 中阅读了一些问题,很多人都遇到过同样的问题。 But there is no proper solution yet.但目前还没有合适的解决方案。 Please check the code.请检查代码。 And thanks in advance.并提前致谢。

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")
        }
    }
}

I have tried so many situations also, Like without encryption, with encryption, with same project target ( While using iPhone Simulator in two computer ), By stopping advertising when finding a device, by stopping browsing whenever an invitation sent.我也尝试过很多情况,比如不加密,加密,具有相同的项目目标(在两台计算机上使用 iPhone 模拟器时),通过在找到设备时停止广告,在发送邀请时停止浏览。 But none of these alternatives solved my issue, it is still in "Connecting..." and directly goes to "Not Connected".但是这些替代方案都没有解决我的问题,它仍然在“正在连接...”中,直接转到“未连接”。 Please let me know your thoughts.请让我知道你的想法。

First check you are in the same wifi network.首先检查您是否在同一个wifi网络中。

But don't forget bulutooth does not work in simulator.但不要忘记 bulutooth 在模拟器中不起作用。

also, device and simulator is completely okay.此外,设备和模拟器完全没问题。 I am working with multiplier for several months.我正在使用乘数几个月。 I noticed connecting - Disconnected state only when both devices/peers are in the different wifi/bluetooth network.我注意到连接 - 只有当两个设备/对等点都在不同的 wifi/蓝牙网络中时才处于断开状态。

If all these are Okay.如果这些都OK。 Then然后

read this and get sample project .阅读此内容并获取示例项目

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM