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使用的更多相关文章
随机推荐
- Maven——向Maven本地仓库中手动添加依赖包(ps:ojdbc.jar)
maven中央仓库中并非包含所有现有的依赖包和插件,部分依赖包和插件需要手动地进行添加(如ojdbc.jar) 一.添加JDK系统环境变量(maven是基于Java的,可参考:https://www. ...
- SVN清理失败(clean up)或者(lock)问题进入死循环最终解决方案
解决方法: step1: 到 sqlite官网 (http://www.sqlite.org/download.html) 下载 sqlite3.exe step2: 将下载到的 sqlite3.ex ...
- <计算机系统结构中的8个伟大思想>
摘自<计算机组成与设计>戴维帕森 ——面向摩尔定律的设计 ——使用抽象简化设计 ——加速大概率事件 ——通过并行提高性能 ——通过流水线提高性能 ——存储器层次 ——通过冗余提高可靠性
- python爬虫学习心得:中国大学排名(附代码)
今天下午花时间学习了python爬虫的中国大学排名实例,颇有心得,于是在博客园与各位分享 首先直接搬代码: import requests from bs4 import BeautifulSoup ...
- 精通awk系列(1):安装新版本的gawk
回到: Linux系列文章 Shell系列文章 Awk系列文章 安装新版本gawk awk有很多种版本,例如nawk.gawk.gawk是GNU awk,它的功能很丰富. 本教程采用的是gawk 4. ...
- 某酒店建筑设计CAD施工图
本素材为某酒店建筑设计CAD施工图,其中包涵的有酒店室内装修图纸.各个标间房屋改造图以及酒店场外建筑施工图.其中图纸的格式都是为dwg格式的.想要查看图纸就可以使用CAD看图软件来进行查看.以下就是一 ...
- dpwwn:2 Vulnhub Walkthrough
此镜像配置了静态IP地址:10.10.10.10,需要调整下网络 主机层扫描: ╰─ nmap -p1-65535 -sV -A 10.10.10.10 80/tcp open http ...
- Violet音乐社区 - 个人总结报告
一.项目概述 1.1 项目背景 音乐是一门艺术,是由有组织的乐音来表达人们情感.反映人类现实生活情感的艺术.现代科技的发展使得人们可以利用网络随时随地的享受音乐,然而在当今互联网却很少有一个以音乐为媒 ...
- 推荐一个好用的行内可编辑的table组件 vxe-table
项目中有一个需要用户点击table单元格可编辑的需求,由于博主用的是elementUI,element组件内实现可编辑,用过的小伙伴都知道,非常麻烦,后来博主在浏览组件的时候发现了 一款非常好用的ta ...
- 49-在 overlay 中运行容器
上一节我们创建了 overlay 网络 ov_net1,今天将运行一个 busybox 容器并连接到 ov_net1: 查看容器的网络配置: bbox1 有两个网络接口 eth0 和 eth1.eth ...