iOS Bonjour 本地服務(wù)通信

Bonjour 是什么?

bonjour其實(shí)來(lái)自法語(yǔ)蜓耻,是你好的意思。而Bonjour服務(wù)是蘋果公司發(fā)布的一個(gè)基于ZEROCONF工作組(IETF下屬小組)的工作,用于實(shí)現(xiàn)零配置網(wǎng)絡(luò)聯(lián)網(wǎng)的解決方案复隆。Bonjour是基于IP層協(xié)議的,簡(jiǎn)單來(lái)說(shuō),就是一套解決方案,能夠不需要復(fù)雜的配置,即可互相發(fā)現(xiàn)彼此的解決方案迫吐∮势ǎ可以用它來(lái)輕松探測(cè)并連接到相同網(wǎng)絡(luò)中的其他設(shè)備整袁,并與別的智能硬件進(jìn)行交互或者其他操作。典型的Bonjour應(yīng)用有Remote佑吝、AirPrint等坐昙。(本段摘自Bonjour的使用-本地通信/智能交互)

如何實(shí)現(xiàn)

    屬性申明 定義
    let domain: String = "local."
    let type: String = "_xiaopao._tcp"
    let port:Int32 = 1234
    var service: NetService!
    var browser: NetServiceBrowser!

1、發(fā)布服務(wù)

    @objc func publishService() {
        // 發(fā)布服務(wù)
        let name: String = "\(Int(Date().timeIntervalSince1970 * 1000))"
        service = NetService(domain: domain, type: type, name: name, port: port)
        service.delegate = self
        service.schedule(in: RunLoop.current, forMode: .common)
        
        // 發(fā)布的數(shù)據(jù)
        let dict: [String: Data] = ["name": "xiaopao".data(using: .utf8) ?? Data()]
        let data = NetService.data(fromTXTRecord: dict)
        service.setTXTRecord(data)
        
        // 開(kāi)始發(fā)布
        service.publish()
    }
1.1 發(fā)布服務(wù)代理
extension ViewController: NetServiceDelegate {
    // 將要發(fā)布服務(wù)
    func netServiceWillPublish(_ sender: NetService) {
        print(#function)
    }
    
    // 發(fā)布失敗處理
    func netService(_ sender: NetService, didNotPublish errorDict: [String : NSNumber]) {
        print(#function)
    }
    
    // 發(fā)布服務(wù)完成
    func netServiceDidPublish(_ sender: NetService) {
        print(#function)
    }
}

2芋忿、瀏覽服務(wù)

    @objc func browseService() {
        //瀏覽服務(wù)
        browser = NetServiceBrowser()
        browser.delegate = self
        browser.schedule(in: RunLoop.current, forMode: .common)
        browser.searchForServices(ofType: type, inDomain: domain)
    }
2.1瀏覽服務(wù)代理
// 瀏覽服務(wù)代理
extension ViewController: NetServiceBrowserDelegate {
    // 將要搜索服務(wù)
    func netServiceBrowserWillSearch(_ browser: NetServiceBrowser) {
        print(#function)
    }
    
    // 搜索不成功處理
    func netServiceBrowser(_ browser: NetServiceBrowser, didNotSearch errorDict: [String : NSNumber]) {
        print(#function)
    }
    
    // 搜索到服務(wù)
    func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) {
        print(#function)
        
        // 搜索服務(wù)開(kāi)始處理
        //調(diào)用 NetServiceDelegate代理的 netServiceWillResolve炸客、netServiceDidResolveAddress等方法
        self.service = service
        service.delegate = self
        service.schedule(in: RunLoop.current, forMode: .common)
        service.resolve(withTimeout: 5)
        
    }
    
    // 服務(wù)已消失或者不可用
    func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool) {
        print(#function)
        let name = service.name
        let type = service.type
        let domain = service.domain
        print("移除服務(wù):····name:\(name),type:\(type),domain:\(domain)")
    }
}

3、互相通信

// 發(fā)布服務(wù)代理
extension ViewController: NetServiceDelegate {
    // 將要處理服務(wù)
    func netServiceWillResolve(_ sender: NetService) {
        print(#function)
    }
    
    // 處理服務(wù)
    func netServiceDidResolveAddress(_ sender: NetService) {
        guard let txtData = sender.txtRecordData() else { return }
        
        print(#function)
        let name = sender.name
        let type = sender.type
        let domain = sender.domain
        let dict = resolveDictionary(fromTXTRecord: txtData)
        print("處理服務(wù):····name:\(name),type:\(type),domain:\(domain),data\(dict)")
    }
    
    // 處理data數(shù)據(jù)轉(zhuǎn)成 字典[String:String]
    func resolveDictionary(fromTXTRecord data: Data) -> [String: String] {
        var dict = [String: String]()
        var offset = 0
        
        data.withUnsafeBytes({
            while offset < $0.count {
                let recordLength = Int($0[offset])
                offset += 1
                if recordLength > 0 {
                    let subBytes = $0[offset..<offset + recordLength]
                    let compoments = subBytes.split(separator: 61)
                    if compoments.count == 2 {
                        let key = String(bytes: Data(compoments[0]), encoding: .utf8) ?? ""
                        let value = String(bytes: Data(compoments[1]), encoding: .utf8) ?? ""
                        dict[key] = value
                    }
                }
                offset += recordLength
            }
        })
        return dict
    }
    
    // 處理服務(wù)時(shí) 發(fā)生錯(cuò)誤
    func netService(_ sender: NetService, didNotResolve errorDict: [String : NSNumber]) {
        print(#function)
    }
    
    func netService(_ sender: NetService, didUpdateTXTRecord data: Data) {
        print(#function)
    }
}

參考文檔:
http://www.reibang.com/p/94c5848894e1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末戈钢,一起剝皮案震驚了整個(gè)濱河市痹仙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殉了,老刑警劉巖开仰,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡众弓,警方通過(guò)查閱死者的電腦和手機(jī)恩溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事赔硫。” “怎么了奶稠?”我有些...
    開(kāi)封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)弦悉。 經(jīng)常有香客問(wèn)我窒典,道長(zhǎng),這世上最難降的妖魔是什么稽莉? 我笑而不...
    開(kāi)封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮涩搓,結(jié)果婚禮上污秆,老公的妹妹穿的比我還像新娘。我一直安慰自己昧甘,他們只是感情好良拼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著充边,像睡著了一般庸推。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浇冰,一...
    開(kāi)封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天贬媒,我揣著相機(jī)與錄音,去河邊找鬼肘习。 笑死际乘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漂佩。 我是一名探鬼主播脖含,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼投蝉!你這毒婦竟也來(lái)了养葵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘩缆,失蹤者是張志新(化名)和其女友劉穎关拒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夏醉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年爽锥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畔柔。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氯夷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靶擦,到底是詐尸還是另有隱情腮考,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布玄捕,位于F島的核電站踩蔚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏枚粘。R本人自食惡果不足惜馅闽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馍迄。 院中可真熱鬧福也,春花似錦、人聲如沸攀圈。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赘来。三九已至现喳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犬辰,已是汗流浹背嗦篱。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忧风,地道東北人默色。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狮腿,于是被迫代替她去往敵國(guó)和親腿宰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355