iOS MultipeerConnectivity

  • problem

    Continuing the above [iOS realizes WIFI transmission], what will happen if the LAN is removed? Can file transfer between devices

    Common methods of data transfer between iOS devices:

      1.蓝牙
      2.airdrop
      3.MultipeerConnectivity
    

    This article only talks about MultipeerConnectivity

  • Serve

    Device as a server

    • There must be a PeerID that marks one's own
    lazy var me: MCPeerID = {
        let peer = MCPeerID(displayName: UIDevice.current.name)
        return peer
    }()
    
    • A session
    lazy var session: MCSession = {
        let ss = MCSession(peer: me, securityIdentity: nil, encryptionPreference: .none)
        ss.delegate = self
        return ss
    }()
    
    • Broadcast out, other devices can search
    lazy var advertiser: MCNearbyServiceAdvertiser = {
        let advertiser = MCNearbyServiceAdvertiser(peer: me, discoveryInfo: ["demo": "data"], serviceType: "shanzhai")
        advertiser.delegate = self
        return advertiser
    }()
    
    • Start broadcasting
    advertiser.startAdvertisingPeer()
    
    • Broadcast proxy method execution
    extension MultipeerConnectVC: MCNearbyServiceAdvertiserDelegate {
        func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
            // 确认连接,赋值session
            invitationHandler(true, session)
        }
        
        func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {
            advertiser.stopAdvertisingPeer()
            print("Woops! Advertising failed with error \(String(describing: error))")
        }
    }
    

    Device as client

    • There must be a PeerID that marks one's own
    lazy var me: MCPeerID = {
        let peer = MCPeerID(displayName: UIDevice.current.name)
        return peer
    }()
    
    • A session
    lazy var session: MCSession = {
        let ss = MCSession(peer: me, securityIdentity: nil, encryptionPreference: .none)
        ss.delegate = self
        return ss
    }()
    
    • Need a search PeerID
    lazy var browser: MCNearbyServiceBrowser = {
        let bs = MCNearbyServiceBrowser(peer: me, serviceType: "shanzhai")
        bs.delegate = self
        return bs
    }()
    
    • Start search
    browser.startBrowsingForPeers()
    
    • The nearby PeerID is retrieved from the agent, and if retrieved, you can save it by yourself, or you can directly link to it according to business needs. Connect here
    extension MultipeerConnectVC: MCNearbyServiceBrowserDelegate {
        func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
            print("search peerId = \(peerID)")
            //搜到了peerID可以放入数组中,选择想要连接的peerID连接,这里直接连接
            browser.invitePeer(peerID, to: session, withContext: nil, timeout: 10)
        }
        
        func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
            print("lost peerID = \(peerID)")
        }
        
        func browser(_ browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: Error) {
            print("error = \(error)")
        }
    }
    

    The connection process looks at the Session, and the session proxy looks at the various processes

    extension MultipeerConnectVC: MCSessionDelegate {
    
        func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
        }
        
        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) {
        }
        
        func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) { 
    
        }
    }
    
    • Proxy method didChange MCSessionState == .connected in the didChange method, indicating that it is connected, and data can be transmitted after connecting

    • The proxy method didFinishReceivingResourceWithName, you can view the received data

    • You can also use MCBrowserViewController to search for the PeerID without writing the interface yourself

  • Conclusion

    This method does not get through iOS and Android, and is suitable for non-network data transmission between Apple devices. The implementation of FileChat between Apple devices should be based on this

Guess you like

Origin blog.csdn.net/God383045/article/details/114250439
ios