iOSMultipeerConnectivity使用
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使用的更多相关文章
随机推荐
- 调用高德API,通过输入的地址,如省份、市、区获取经纬度 ,通过输入的经纬度,获取区域详情
一.pom <?xml version="1.0" encoding="UTF-8"?><projectxmlns="http:// ...
- wx-icon和progress
基本内容 index.wxml <!--index.wxml--> <view class="container"> <!--icon text pr ...
- 如何减小ABAP业务代码的复杂度
在程序开发的过程中,相同的功能往往有不同的实现方式.对于可以实现同样功能的不同代码,复杂度是用于比较其质量优劣的重要指标. 在本文中,代码复杂度是指代码被理解/修改的难易程度.越容易被理解.修改的代码 ...
- Java面试必看之Integer.parseInt()与Integer.valueOf()
Integer.parseInt()和Integer.valueOf()都是将成为String转换为Int,但是为什么Java会提供两个这样的方法呢,他们如果是同样的操作,岂不是多此一举? 我们来深挖 ...
- Aery的UE4 C++游戏开发之旅(1)基础对象模型
目录 UObject Actor种类 AActor APawn(可操控单位) AController(控制器) AGameMode(游戏模式) AHUD(HUD) ... Component种类 UA ...
- RedisSession (自定义)
RedisSession (自定义) 疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Red ...
- 一篇文章看懂JS闭包,都要2020年了,你怎么能还不懂闭包?
壹 ❀ 引 我觉得每一位JavaScript工作者都无法避免与闭包打交道,就算在实际开发中不使用但面试中被问及也是常态了.就我而言对于闭包的理解仅止步于一些概念,看到相关代码我知道这是个闭包,但闭包 ...
- 4. java基础之修饰符
其他修饰符 public 可以修饰属性.方法.构造方法.类 protected 可以修饰属性.方法.构造方法 default 可以修饰属性.方法.构造方法.类 private 可以修饰属性.方法.构造 ...
- GO基础之接口
一.概念1. 面向对象语言中,接口用于定义对象的行为.接口只指定对象应该做什么,实现这种行为的方法(实现细节)是由对象来决定.2. 在Go语言中,接口是一组方法签名. •接口只指定了类型应该具有的方法 ...
- Java源码记录 - AbstractMap
路径java.util.AbstractMap ()构造方法 /** * 唯一的构造器.(一般由子类隐式调用) */ protexted AbstractMap(){ } size()返回当前map的 ...