iOS MultipeerConnectivity

  • 问题

    承接上文[iOS实现WIFI传书],如果去掉局域网会如何?能否实现设备间文件传输

    iOS设备间的数据传输常用方式:

      1.蓝牙
      2.airdrop
      3.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 = self
        return ss
    }()
    
    • 广播出去,其他设备才能搜索到
    lazy var advertiser: MCNearbyServiceAdvertiser = {
        let advertiser = MCNearbyServiceAdvertiser(peer: me, discoveryInfo: ["demo": "data"], serviceType: "shanzhai")
        advertiser.delegate = self
        return advertiser
    }()
    
    • 开始广播
    advertiser.startAdvertisingPeer()
    
    • 广播的代理方法执行
    extension MultipeerConnectVC: MCNearbyServiceAdvertiserDelegate {
        func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
            // 确认连接,赋值session
            invitationHandler(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 = self
        return ss
    }()
    
    • 需要一个搜索PeerID
    lazy var browser: MCNearbyServiceBrowser = {
        let bs = MCNearbyServiceBrowser(peer: me, serviceType: "shanzhai")
        bs.delegate = self
        return 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在苹果设备之间的实现方式应该是基于此进行的

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容