iOS MultipeerConnectivity
问题
承接上文[iOS实现WIFI传书],如果去掉局域网会如何?能否实现设备间文件传输
iOS设备间的数据传输常用方式:
1.蓝牙2.airdrop3.MultipeerConnectivity
该篇单讲MultipeerConnectivity
上菜
设备作为服务端
- 要有一个标志自己的PeerID
lazy var me: MCPeerID = {let peer = MCPeerID(displayName: UIDevice.current.name)return peer }()
- 一个session
lazy var session: MCSession = {let ss = MCSession(peer: me, securityIdentity: nil, encryptionPreference: .none)ss.delegate = selfreturn ss }()
- 广播出去,其他设备才能搜索到
lazy var advertiser: MCNearbyServiceAdvertiser = {let advertiser = MCNearbyServiceAdvertiser(peer: me, discoveryInfo: ["demo": "data"], serviceType: "shanzhai")advertiser.delegate = selfreturn advertiser }()
- 开始广播
advertiser.startAdvertisingPeer()
- 广播的代理方法执行
extension MultipeerConnectVC: MCNearbyServiceAdvertiserDelegate {func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {// 确认连接,赋值sessioninvitationHandler(true, session)}func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {advertiser.stopAdvertisingPeer()print("Woops! Advertising failed with error \(String(describing: error))")} }
设备作为客户端
- 要有一个标志自己的PeerID
lazy var me: MCPeerID = {let peer = MCPeerID(displayName: UIDevice.current.name)return peer }()
- 一个session
lazy var session: MCSession = {let ss = MCSession(peer: me, securityIdentity: nil, encryptionPreference: .none)ss.delegate = selfreturn ss }()
- 需要一个搜索PeerID
lazy var browser: MCNearbyServiceBrowser = {let bs = MCNearbyServiceBrowser(peer: me, serviceType: "shanzhai")bs.delegate = selfreturn bs }()
- 开始搜索
browser.startBrowsingForPeers()
- 代理中检索到附近的PeerID, 检索到可以自己存下来,也可以直接链接,依业务需求来,此处直连
extension MultipeerConnectVC: MCNearbyServiceBrowserDelegate {func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {print("search peerId = \(peerID)")//搜到了peerID可以放入数组中,选择想要连接的peerID连接,这里直接连接browser.invitePeer(peerID, to: session, withContext: nil, timeout: 10)}func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {print("lost peerID = \(peerID)")}func browser(_ browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: Error) {print("error = \(error)")} }
连接过程看Session,session代理中看各个过程
extension MultipeerConnectVC: MCSessionDelegate {func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {}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) {}func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) { } }
代理方法didChange didChange方法中 MCSessionState == .connected,表示连接上,连接上后可传递数据
代理方法didFinishReceivingResourceWithName,可以查看接收到的数据
也可使用MCBrowserViewController,搜索到的PeerID,无需自己写界面
结语
该方式并未打通iOS与Android,适用于苹果设备之间的无网络数据传输。FileChat在苹果设备之间的实现方式应该是基于此进行的
iOS MultipeerConnectivity相关推荐
- iOS 局域网通讯 MultipeerConnectivity
iOS 局域网通讯 MultipeerConnectivity 问题 最近想做一个小游戏demo,需要这个功能:两台设备使用本地局域网进行游戏. 于是查找到iOS实现局域网的API,最终决定用Mult ...
- iOS开发总结(A0)- MultipeerConnectivity
MultipeerConnectivity 使设备通过 bluetooth 或者local wifi连接,简单易用 主要类: 1. advertiser:向其他设备广播 若用系统的标准ui,使用 MC ...
- iOS传感器:实现一个随屏幕旋转的图片
作者 非典型技术宅 关注 2017.05.24 17:22* 字数 1568 阅读 351评论 7喜欢 14 在写上一个动画系列的时候学到了非常多的知识,也认识了很多人.例如受邀进入了某个神秘的动效组 ...
- iOS之深入解析操作系统的架构
一.iOS 系统架构层次 在 iOS 中,框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像.声音文件等其它资源.共享资源库定义应用程序可以调用的函数和方法. iOS 为 ...
- iOS开发 蓝牙技术4.0详解
前言 前端时间,同学在做项目过程中遇到关于蓝牙方面的问题,今天我就给大家进行详细的进行讲解下蓝牙在iOS开发中的具体实现.在介绍蓝牙前,大家要搞清楚什么是蓝牙? 什么是蓝牙? 随着蓝牙低功耗技术BLE ...
- iOS各个版本的新特性介绍
官方汇总 What's News in iOS iOS 9.3 to iOS 10.0 API Differences Objective-C /usr/include Accelerate Audi ...
- iOS 苹果官方Demo
GitHub 文章链接地址, 欢迎Star+Fork Mirror of Apple's iOS samples This repository mirrors Apple's iOS samples ...
- iOS 苹果官方Demo合集
转自:https://github.com/WildDylan/appleSample Mirror of Apple's iOS samples This repository mirrors Ap ...
- iOS操作系统的层次架构和相关服务
Cocoa Touch Layer(触摸UI层).MediaLayer(媒体层).CoreServices Layer(核心服务层).Core OS Layer(核心OS层). CocoaTouch ...
最新文章
- python画树叶-Python如何生成树形图案
- android 写字体投影,android之字体阴影效果
- 帐号体系:后端信息结构设计
- sql a 表 若包含b表 则a 表 列显示_几道常见的SQL面试题,看你能答对几道?
- .gitignore失效 无法忽略node_modules问题
- python requests cookies请求_python+requests实现接口测试 - cookies的使用
- 网络通信之TCP Client通信(基于Arduino)
- CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)
- 新公司入职56天后的面谈小结
- 中国电信物联网平台入门学习笔记7:NB-IOT信号如何检测
- Kali Linux信息收集工具
- 高德地图纠偏 php,驾车轨迹纠偏-轨迹纠偏-示例中心-JS API 示例 | 高德地图API
- android如何虚标内存,答疑 | 手机运存明明是6GB,但实际可用才3.5GB?是虚标还是什么?...
- Redis Cluster集群
- Web爬虫|入门教程之爬虫简介
- oracle赋权directory,ORACLE DIRECTORY目录管理步骤
- V2X方案之RSU介绍
- 关于PHP中如何跟踪报错的手段
- Python 为什么list不能作为字典的key?
- 变更请求、批准的变更、确认的变更
热门文章
- 魅族手机调试出现is waiting for debugger的问题解决
- android.view.WindowLeaked的解决办法 has leaked window android.widget.PopupWindow$PopupDecorView
- unity实现对话控制
- 蘑菇街 java 面试_【蘑菇街java工程师面试】蘑菇街Java后台开发二面挫败-看准网...
- Tomcat8.0系列配置GlobalSign SSL证书
- 揭秘微信新骗局:微信扫码进群付费暗雷源码 诱导支付百倍暗雷程序-如何判刑,如何举报?
- web前端html实例-Html5实现的语音搜索功能
- 揭秘HTML5小游戏排名,究竟哪些游戏最受欢迎?
- 【案例实践】Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用
- c++类与对象(一)