zoukankan      html  css  js  c++  java
  • 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)

            }

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

  • 相关阅读:
    max-points-on-a-line
    evaluate-reverse-polish-notation
    minimum-depth-of-binary-tree
    ML&MLDS笔记:偏差 vs 方差
    机器人的运动范围
    矩阵中的路径
    滑动窗口的最大值
    数据流中的中位数
    1.微服务架构设计(英文-起源)
    5.如何复制一个文件(编程)
  • 原文地址:https://www.cnblogs.com/duzhaoquan/p/10375005.html
Copyright © 2011-2022 走看看