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使用的更多相关文章
随机推荐
- 集合框架关于<list接口><map接口>的运用
集合: 集合就是一个容器,他可以存储对象,我们说集合就是一个可变的数组 集合框架特点 1.list和set集合同时实现了collection接口 2.set集合存储唯一,无序的对象. 3.list 存 ...
- ElasticSearch - 遐想
众所周知,ElasticSearch 存在一个问题,无法查询最近 1s 的写入.近实时这个属性,限制了其在某些场景的应用.本文记录了我在日常工作中想到的,解决特定场景的一些方案.既然是记录,便会有好有 ...
- 集合系列 Map(十三):LinkedHashMap
我们之前说过 LinkedHashMap 是在 HashMap 的基础上,增加了对插入元素的链表维护.那么其到底是怎么实现的呢?今天这篇文章就带我们来一探究竟. public class Linked ...
- tl-wr742n 怎么设置dns
打开无线路由器,用笔记本设置,点击无线网络,点击连接需要设置的无线路由 在弹出的菜单点击[是] 在无线路由器有的背面有个标签,上面PIN码,输入PIN码 打开IE浏览器在地址栏输入192.168 ...
- 简单了解css3轮廓outline
outline属性是用来设置一个或多个单独的轮廓属性的简写属性 , 例如 . 轮廓有下面几个属性: { outline-style: solid; outline-width: 10px; outli ...
- POI解析Excel时,如何获取单元格样式以及单元格Style的一些操作
最近,公司运营平台需要上传Excel文件并进行解析导入数据库,在开发完成后出现了一个始料不及的生产bug,下面是具体原因: 1.在用POI解析Excel时,默认如果Excel单元格中没有数据,且单元格 ...
- iOS引导页(开局滚动效果)
参考链接1:https://jingyan.baidu.com/article/4dc40848a341dfc8d846f152.html 参考链接2:https://www.cnblogs.com/ ...
- 设置自动获取IP和DNS
问题阐述 设置ipv4的自动获取时遇到一个问题,ip和dns自动获取可以确认设置,但是全局时就是报错,回头去看ipv4的ip和dns也还是原来的样子 由于一直使用的都是自动获取,很少会有主动设置ip或 ...
- MySQL数据库:函数的应用
字符串截取 # 从左边开始 第1个字符 left(字段名,1) # 从那里开始,截取几个 substring(字段名,1,1) str函数 # 连接字符串 concat(s1,s2,s3,--,sn) ...
- element-ui 中Switch的用法
在element-ui中,如果你想知道Switch是开还是关,使用事件 @change="getchange(value2)" 它会输出true或者false.true代表的是开, ...