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. JS--- part6课程介绍 & part5复习

    part6 课程介绍 scroll系列:-----重点,每个属性是什么意思 封装scroll系列的相关的属性,固定导航栏案例---事件浏览器的滚动条事件--能够写出来 封装动画函数---缓动动画--- ...

  2. [20191218]降序索引疑问4.txt

    [20191218]降序索引疑问4.txt --//前几天优化一个项目,我发现许多表里面有有隐含字段,一般开发很少建立函数索引.我自己检查发现里面存在大量的降序索引.--//我感觉有点奇怪,为什么开发 ...

  3. Unity Ruby's Adventure 第二步

    加载游戏资源(已注册Unity) Step1:打开Unity 依次点击 Window>Asset Store(资源商店) Step2:搜索资源 Ruby's Adventure Step3:购买 ...

  4. Appium(十):元素定位(加强版)

    1. 元素定位 写完上一篇元素定位的博客,发现实用性基本为零.这几天真的烦死我了,一直在找资料,还去看了一遍appium官网文档.最后结合着selenium的定位方法,测试出几种可行的元素定位方法. ...

  5. 针对上一篇prim最后的完善结果

    edge* Graph::prim(int cur) { if (cur >= this->vertexNum) { return NULL; } int *weight = new in ...

  6. Java每日一面(Part2数据库)[19/11/28]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.如何设计一个关系型数据库 如上图,首先划分成两大部分: ​ 1.存储部分:类似一个文件系统,把数据存储到一个持久化设备中,如机械硬盘,固态等 ​ ...

  7. js的常用场景效果

    转自https://www.cnblogs.com/tangdiao/p/9481681.html 1.checkbox的使用场景,学习之后就是购物车页面的自动计算的上手示例. 做成给checkbox ...

  8. Kali Linux configuration "Ettercap"

    Xx_Instroduction Ettercap is a man-in-the-middle attack(MITM) tool,kali take this tool,so,use front ...

  9. 【Cocos谁学谁会】制作会跑动的地板

    版权申明: 本文原创首发于以下网站,您可以自由转载,但必须加入完整的版权声明 博客园:https://www.cnblogs.com/MogooStudio/ csdn博客:https://blog. ...

  10. Github访问速度很慢的原因,以及解决方法

    1,CDN,Content Distribute Network,可以直译成内容分发网络,CDN解决的是如何将数据快速可靠从源站传递到用户的问题.用户获取数据时,不需要直接从源站获取,通过CDN对于数 ...