-
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
iOS MultipeerConnectivity
Guess you like
Origin blog.csdn.net/God383045/article/details/114250439
Recommended
Ranking