• 问题

    承接上文[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相关推荐

  1. iOS 局域网通讯 MultipeerConnectivity

    iOS 局域网通讯 MultipeerConnectivity 问题 最近想做一个小游戏demo,需要这个功能:两台设备使用本地局域网进行游戏. 于是查找到iOS实现局域网的API,最终决定用Mult ...

  2. iOS开发总结(A0)- MultipeerConnectivity

    MultipeerConnectivity 使设备通过 bluetooth 或者local wifi连接,简单易用 主要类: 1. advertiser:向其他设备广播 若用系统的标准ui,使用 MC ...

  3. iOS传感器:实现一个随屏幕旋转的图片

    作者 非典型技术宅 关注 2017.05.24 17:22* 字数 1568 阅读 351评论 7喜欢 14 在写上一个动画系列的时候学到了非常多的知识,也认识了很多人.例如受邀进入了某个神秘的动效组 ...

  4. iOS之深入解析操作系统的架构

    一.iOS 系统架构层次 在 iOS 中,框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像.声音文件等其它资源.共享资源库定义应用程序可以调用的函数和方法. iOS 为 ...

  5. iOS开发 蓝牙技术4.0详解

    前言 前端时间,同学在做项目过程中遇到关于蓝牙方面的问题,今天我就给大家进行详细的进行讲解下蓝牙在iOS开发中的具体实现.在介绍蓝牙前,大家要搞清楚什么是蓝牙? 什么是蓝牙? 随着蓝牙低功耗技术BLE ...

  6. iOS各个版本的新特性介绍

    官方汇总 What's News in iOS iOS 9.3 to iOS 10.0 API Differences Objective-C /usr/include Accelerate Audi ...

  7. iOS 苹果官方Demo

    GitHub 文章链接地址, 欢迎Star+Fork Mirror of Apple's iOS samples This repository mirrors Apple's iOS samples ...

  8. iOS 苹果官方Demo合集

    转自:https://github.com/WildDylan/appleSample Mirror of Apple's iOS samples This repository mirrors Ap ...

  9. iOS操作系统的层次架构和相关服务

    Cocoa Touch Layer(触摸UI层).MediaLayer(媒体层).CoreServices Layer(核心服务层).Core OS Layer(核心OS层). CocoaTouch ...

最新文章

  1. python画树叶-Python如何生成树形图案
  2. android 写字体投影,android之字体阴影效果
  3. 帐号体系:后端信息结构设计
  4. sql a 表 若包含b表 则a 表 列显示_几道常见的SQL面试题,看你能答对几道?
  5. .gitignore失效 无法忽略node_modules问题
  6. python requests cookies请求_python+requests实现接口测试 - cookies的使用
  7. 网络通信之TCP Client通信(基于Arduino)
  8. CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)
  9. 新公司入职56天后的面谈小结
  10. 中国电信物联网平台入门学习笔记7:NB-IOT信号如何检测
  11. Kali Linux信息收集工具
  12. 高德地图纠偏 php,驾车轨迹纠偏-轨迹纠偏-示例中心-JS API 示例 | 高德地图API
  13. android如何虚标内存,答疑 | 手机运存明明是6GB,但实际可用才3.5GB?是虚标还是什么?...
  14. Redis Cluster集群
  15. Web爬虫|入门教程之爬虫简介
  16. oracle赋权directory,ORACLE DIRECTORY目录管理步骤
  17. V2X方案之RSU介绍
  18. 关于PHP中如何跟踪报错的手段
  19. Python 为什么list不能作为字典的key?
  20. 变更请求、批准的变更、确认的变更

热门文章

  1. 魅族手机调试出现is waiting for debugger的问题解决
  2. android.view.WindowLeaked的解决办法 has leaked window android.widget.PopupWindow$PopupDecorView
  3. unity实现对话控制
  4. 蘑菇街 java 面试_【蘑菇街java工程师面试】蘑菇街Java后台开发二面挫败-看准网...
  5. Tomcat8.0系列配置GlobalSign SSL证书
  6. 揭秘微信新骗局:微信扫码进群付费暗雷源码 诱导支付百倍暗雷程序-如何判刑,如何举报?
  7. web前端html实例-Html5实现的语音搜索功能
  8. 揭秘HTML5小游戏排名,究竟哪些游戏最受欢迎?
  9. 【案例实践】Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用
  10. c++类与对象(一)