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)

}

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

iOSMultipeerConnectivity使用的更多相关文章

随机推荐

  1. div拖拽效果 JQuery

    <!DOCTYPE html> <html> <head> <meta name="description" content=" ...

  2. 无法Google的解决方案

    献给新入开发行业的小伙伴. 本文不会事无巨细的讲解每一个细节,只是为读者提供一个路线图,并提供相应的参考资料. 为了更高效的解决各种技术问题,有时不得不到墙外去寻找解决方案.每个开发者效率高了,宏观来 ...

  3. linux部署.net Core项目

    首篇笔记,多多关照.方便回忆和给新手指导,大神绕道 首先在Linux系统部署.net Core项目首先准备一个Linux系统的服务器,百度云,阿里云都行. 1.net core 部署在Linux系统上 ...

  4. Zuul Swagger 整合

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...

  5. 使用mysql-proxy实现mysql的读写分离

     前言: MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力.使用mysql-proxy实现mysql的读写分离,mysq ...

  6. 精通awk系列(9):修改字段或NF引起的$0重新计算

    回到: Linux系列文章 Shell系列文章 Awk系列文章 修改字段或NF值的联动效应 注意下面的分割和计算两词:分割表示使用FS(field Separator),计算表示使用预定义变量OFS( ...

  7. Python——高阶函数概念(Higher-order function)

    1.变量可以指向函数 以内置的求绝对值abs()函数为例,: >>> abs(-12) 12 >>> abs <built-in function abs&g ...

  8. Nlog配置

    初次使用nlog,里里外外找了好久,终于搞会了. 使用nlog建日志输出到txt文件.数据库.邮件 nlog配置,如图 码云dome

  9. Git实战指南----跟着haibiscuit学Git(第八篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...

  10. Angular(06)- 为什么数据变化,绑定的视图就会自动更新了?

    这里提一点,前端三大框架(Angular,React,Vue)的数据驱动来更新视图的原理,即 MVVM 的实现. 为什么数据发生变化,绑定的视图就会刷新了呢? 以下是我的个人理解,仅供参考: 在还是 ...