iOSMultipeerConnectivity使用

MultipeerConnectivity是iOS7推出的多点连接框架,多用于文件传输,类似于iOS设备的airTrop隔空投放,在没有联网的情况下也能聊天传文件。

使用方法,一个设备作为广播开放PeerID,另一个设备搜索广播的peerID,建立连接相互发送文件

1,首先每个设备都要创建一个PeerID用来标示自己

 // MD1

    lazy var me: MCPeerID = {

        let peer: MCPeerID

            peer = MCPeerID(displayName: UIDevice.current.name)

          return peer

    }()

2.创建连接需要MCSession,设置代理,实现代理方法

    // MD2

    lazy var session: MCSession = {

        let s = MCSession(peer: me, securityIdentity: nil, encryptionPreference: .none)

         s.delegate = self

        return s

    }()

// MD3

extension PeerService: MCSessionDelegate {

 

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

        switch state {

        case .connected:

            print("Now connected to \(peerID.displayName)")

            DispatchQueue.main.async {

                self.didConnectToDevice?(peerID.displayName)

            }

        case .connecting:

            print("Connecting to \(peerID.displayName)")

        case .notConnected:

            print("NOT connected to \(peerID.displayName)")

        }

    }

 

    func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {

 

    }

 

    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) {

        NSLog("Started resource download: \(resourceName)")

    }

 

    func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {

        NSLog("Finished resource download: \(resourceName)")

 

        // MD12

        guard let url = localURL else { return }

 

        DispatchQueue.main.async {

            self.didReceiveFile?(url)

        }

    }

 

}

3广播peerID

  // MD4

    lazy var advertiser: MCNearbyServiceAdvertiser = {

        let a = MCNearbyServiceAdvertiser(peer: me, discoveryInfo: ["demo": "data"], serviceType: "MultipeerDemo")

 

        a.delegate = self

 

        return a

    }()

    func startAdvertising() {

        // MD6

        advertiser.startAdvertisingPeer()

    }

4实现广播ID的代理方法

// MD5

extension PeerService: MCNearbyServiceAdvertiserDelegate {

 

    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {

        // This is insecure! We should verify that the peer is valid and etc etc

        invitationHandler(true, session)    //确认连接,把session赋给它

    }

 

    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {

        NSLog("Woops! Advertising failed with error \(String(describing: error))")

    }

 

}

5.作为搜索的peerID要创建browser实现代理方法

// MD7

    lazy var browser: MCNearbyServiceBrowser = {

        let b = MCNearbyServiceBrowser(peer: me, serviceType: "MultipeerDemo")

 

        b.delegate = self

 

        return b

    }()

     func startListening() {//开始搜索

        // MD9

        browser.startBrowsingForPeers()

    }

// MD8

extension PeerService: MCNearbyServiceBrowserDelegate {

 

    func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {

      //搜到了peerID可以放入熟组中,选择想要连接的peerID连接,这里直接连接

browser.invitePeer(peer, to: session, withContext: nil, timeout: 10)

    }

 

    func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {

        NSLog("Puke")

    }

 

}

 //发送图片

    func sendPicture(with data: Data, completion: @escaping (Error?) -> Void) {

        // MD11

        guard let peer = session.connectedPeers.last else {

            NSLog("No connected peers to send to")

            return

        }

 

        guard let baseURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first else {

            fatalError("No caches directory. WHAT?!")

        }

 

        let filename = UUID().uuidString + ".png"

 

        let fileURL = baseURL.appendingPathComponent(filename)

 

        do {

            try data.write(to: fileURL, options: .atomicWrite)

 

            session.sendResource(at: fileURL,

                                 withName: filename,

                                 toPeer: peer,

                                 withCompletionHandler: completion)

        } catch {

            completion(error)

        }

    }

//发送字符串data

        let srt = "hello"

        if let data = srt.data(using: .utf8){

           try! session.send(data, toPeers: [peerID], with: .reliable)

        }

接收到数据后进行相应的处理得到想要的数据

 

posted @ 2019-02-14 15:50  不停奔跑的蜗牛  阅读(802)  评论(2编辑  收藏  举报