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. 手摸手教你编写你人生中第一个HTML页面

    本文是<HTML5与CSS3基础语法自学教程>的第二篇,首发于[前端课湛]微信公众号. 导读:本小节主要讲解 HTML 的基础语法内容,将通过编写第一个 HTML 页面来学习 HTML 的 ...

  2. spring boot 2 + shiro 实现简单的身份验证例子

    Shiro是一个功能强大且易于使用的Java安全框架,官网:https://shiro.apache.org/. 主要功能有身份验证.授权.加密和会话管理.其它特性有Web支持.缓存.测试支持.允许一 ...

  3. ImportError: No module named flask 导包失败,Python3重新安装Flask模块

    在部署环境过程中,通过pip install -r requirements.txt安装包,结果启动项目时总是报错,显示没有flask模块,通过pip install flask还是不行,于是下载fl ...

  4. springcloud配置中心

    SpringCloud Config简介 Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持 ...

  5. IOC、DI、DIP

    OCP: 开闭原则  对修改关闭  对扩展开放 1.面向对象主要做俩件事:实例化对象和调用方法(完成业务逻辑) 2.单纯interface可以统一方法的调用,但是不能统一对象的实例化 3.只有一段代码 ...

  6. Linux Redis 安装(带视频)

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

  7. C#实现地图坐标系的转换(WGS-84、GCJ-02、BD-09)

     WGS-84坐标系:全球定位系统使用,GPS.北斗等 GCJ-02坐标系:中国地区使用,由WGS-84偏移而来 BD-09坐标系:百度专用,由GCJ-02偏移而来 (PS:源于项目需求,本来是想读图 ...

  8. PHP $_SERVER超全局变量详解

    参考资料:https://www.php.net/manual/zh/reserved.variables.server.php $_SERVER 是一个包含了诸如头信息(header).路径(pat ...

  9. Centos7 基于SVN+Apache+IF.svnadmin实现web管理

    1.简单介绍: iF.SVNAdmin应用程序是您的Subversion授权文件的基于Web的GUI.它基于PHP 5.3,需要安装一个Web服务器(Apache).该应用程序不需要数据库后端或任何类 ...

  10. 如何在Mac上使用Netstat命令

    macOS上的netstat命令是一个终端命令,用于显示有关Mac网络通信的详细信息.网络通信包括Mac通过所有端口和所有应用程序与外界进行交流的所有方式.掌握netstat可以帮助您了解计算机之间的 ...