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使用的更多相关文章
随机推荐
- Vue+Webpack之 代码及打包优化
本文重点介绍Vue单页面应用的优化手段: 异步加载 面切换时加loading特效 点击延迟 inline manifest 逻辑代码优化 依赖包体积优化 cdn引用 Vue代码优化 异步加载 所谓的异 ...
- maven的下载、安装及配置
一.下载maven 1. maven的下载路径 (1)Apache官网:https://maven.apache.org (2)https://pan.baidu.com/s/1Yvv44ICGSxG ...
- Python3 pickle模块用法
pickle(python3.x)和cPickle(python2.x的模块)相当于java的序列化和反序列化操作. 常采用下面的方式使用: import pickle pickle.dump(obj ...
- Execl数据上传到数据库
=============================================================asp.net================================ ...
- 搭建部署Docker
Docker安装准备: 首先看下服务器是否有旧版本,如果有需要卸载并且安装依赖 yum remove docker docker-client docker-client-latest docker- ...
- MySQL数据库~~~~~存储引擎
1. InnoDB InnoDB引擎特点: 1.支持事务:支持4个事务隔离界别,支持多版本读. 2.行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响. 3.读写 ...
- log file switch (checkpoint incomplete) - 容易被误诊的event
本文转自 https://blogs.oracle.com/database4cn/log-file-switch-checkpoint-incomplete-%e5%ae%b9%e6%98%93%e ...
- CentOS7 如何升级Git
CentOS7自带的git版本1.8.3.1,这个版本有点低了.于是决定折腾升级,我首先想到的是用update更新: yum update git 结果,事与原违,还是1.8.3.1.在网上提供的升级 ...
- [Go] 实现websocket服务端
直接使用官方子包可以实现websocket协议, golang.org/x/net/websocket 如果在这个目录没有这个包就去github下载net库,放进这个目录$GOPATH/src/gol ...
- Linux防火墙常用命令
Centos7 查看防火墙状态 sudo firewall-cmd --state 输出running则表示防火墙开启,反之则是关闭,也可以使用下面命令进行查询 sudo systemctl stat ...