简体   繁体   中英

Multipeer connectivity- how to view the found devices

I'm using Multipeer Connectivity in Swift 4, I'm wondering how to view the found devices when the program runs, i got a little help but i still don't quite understand all of it. I also don't know where to put this:

extension viewcontroller : MCBrowserViewControllerDelegate {
func browserViewControllerDidFinish(_ browserViewController:                         
MCBrowserViewController) {
serviceBrowser.dismiss(animated: true, completion: nil)
}
func browserViewControllerWasCancelled(_ browserViewController:   
MCBrowserViewController) {
serviceBrowser.dismiss(animated: true, completion: nil)
}

}        

Here is my full code, please correct any code if needed, I also put the extension at the bottom of the code below:

import UIKit
import PlaygroundSupport
import MultipeerConnectivity
PlaygroundPage.current.needsIndefiniteExecution = true
var peerID: MCPeerID!
var mcSession: MCSession!
var mcAdvertiserAssistant: MCAdvertiserAssistant!
var foundPeers = [MCPeerID]()


class viewcontroller: UIViewController {
override func viewDidLoad() {
    var serviceBrowser : MCBrowserViewController!
    func startBrowsingForPeer()  {
        serviceBrowser = MCBrowserViewController(serviceType: "lightning417techa", session: mcSession)

        serviceBrowser.delegate.self

    }



    peerID = MCPeerID(displayName: UIDevice.current.name)
    mcSession = MCSession(peer: peerID, securityIdentity: nil, encryptionPreference: .none)
    mcSession.delegate.self

    class ViewController: UIViewController, MCSessionDelegate, MCBrowserViewControllerDelegate {



        let session = MCSession(peer: peerID, 
                                securityIdentity: nil, 
                                encryptionPreference: .none)



        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 browser(browser: MCNearbyServiceBrowser!, foundPeer peerID: MCPeerID!, withDiscoveryInfo info: [NSObject : AnyObject]!) {
            foundPeers.append(peerID)

            print(browser)
        }


        func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
            if let image = UIImage(data: data) {
                DispatchQueue.main.async { [unowned self] in
                    print("image recieved")
                }
            }
        }
        func sendImage(img: UIImage) {
            if mcSession.connectedPeers.count > 0 {
                if let imageData = UIImagePNGRepresentation(img) {
                    do {
                        try mcSession.send(imageData, toPeers: mcSession.connectedPeers, with: .reliable)
                    } catch let error as NSError {
                        let ac = UIAlertController(title: "Send error", message: error.localizedDescription, preferredStyle: .alert)
                        ac.addAction(UIAlertAction(title: "OK", style: .default))
                        present(ac, animated: true)
                    }
                }
            }
        }

        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?) {
        }
        func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
            dismiss(animated: true)
        }
        func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
            dismiss(animated: true)
        }


        func startHosting(action: UIAlertAction!) {
            mcAdvertiserAssistant = MCAdvertiserAssistant(serviceType: "hws-ridleyn", discoveryInfo: nil, session: mcSession)
            mcAdvertiserAssistant.start()
        }
        func joinSession(action: UIAlertAction!) {
            let mcBrowser = MCBrowserViewController(serviceType: "hws-ridleyn", session: mcSession)
            mcBrowser.delegate = self
            present(mcBrowser, animated: true)
        }

        let vc = UIToolbar(frame: CGRect(x: 100, y: 100, width: 200, height: 200))


        // your view controller here
    }


    let vcc = ViewController()
    vcc.startHosting(action: nil)
    ViewController.startHosting(vcc)

    }
}



PlaygroundPage.current

extension viewcontroller : MCBrowserViewControllerDelegate {
func browserViewControllerDidFinish(_ browserViewController:    MCBrowserViewController) {          
serviceBrowser.dismiss(animated: true, completion: nil)
}
func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
serviceBrowser.dismiss(animated: true, completion: nil)
}

}

I just edited the extension but it says that serviceBrowser Is somehow incorrect and it wants to replace it with NetServiceBrowser . So when i did that it days that NetServiceBrowser has no member dismiss .

MCSession includes a variable named connectedPeers.

var connectedPeers: [MCPeerID] An array of all peers that are currently connected to this session.

See Apple documentation - MCSession class

If its the list of found peers you require, modify the stored property as

var foundPeers = [MCPeerID]() {
    didSet {
        let peers = foundPeers.map( {$0.displayName} )
        yourFoundPeerLabel.text = String(format: "Found Peers: %@", peers.joined(separator: ", "))
    }
}

The storedProperty is updated each time a device is found and your label will automatically be updated when the new peer is appended to list. Refer your implementation of the delegate method

func browser(browser: MCNearbyServiceBrowser!, foundPeer peerID: MCPeerID!, withDiscoveryInfo info: [NSObject : AnyObject]!);    

PS: If you need the list of connected devices create a similar stored property and use the delegate method

func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState);

to add devices to the list. The logic remains the same.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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