iOS端SwiftProtobuf集成

蘋(píng)果在github的SwiftProtobuf地址:https://github.com/apple/swift-protobuf
懶得看的直接去按照蘋(píng)果的文檔操作即可(不過(guò)可能有坑脾歧,見(jiàn)下文)
這篇文章的目的指蚜,是想簡(jiǎn)略的說(shuō)一下Protobuf是什么,以及接入為什么要做一些額外的事情涨椒。

一摊鸡、背景摘要

Protobuf是谷歌搞的一種數(shù)據(jù)格式,按照官方的說(shuō)法蚕冬,和編程語(yǔ)言無(wú)關(guān)免猾,和計(jì)算平臺(tái)無(wú)關(guān),就像XML和JSON一樣囤热,它就是一種數(shù)據(jù)格式而已猎提。
但網(wǎng)絡(luò)傳輸中的數(shù)據(jù)是二進(jìn)制的,要為上層開(kāi)發(fā)者所用就得對(duì)應(yīng)的語(yǔ)言支持解析了旁蔼,而在iOS這邊锨苏,谷歌官方只實(shí)現(xiàn)了OC的解析,并沒(méi)有支持Swift的解析棺聊。伞租。。限佩。葵诈。裸弦。
but,蘋(píng)果官方親自出馬實(shí)現(xiàn)了一個(gè)解析庫(kù)(鏈接文首)作喘,現(xiàn)在都已經(jīng)要2023了理疙,誰(shuí)還用OC啊泞坦!(主要作者現(xiàn)在的項(xiàng)目都是Swift為主??)窖贤,所以我們忽略掉OC直接上Swift,如果項(xiàng)目里OC實(shí)在是真的換不掉或者不值得換贰锁,那就真誠(chéng)的建議把數(shù)據(jù)解析層用Swift實(shí)現(xiàn)赃梧,搞個(gè)適配器給OC調(diào)用即可。

二李根、插件安裝

我們上面說(shuō)的解析,其實(shí)嚴(yán)格來(lái)講并不準(zhǔn)確几睛,因?yàn)镻rotobuf的工作原理是先通過(guò)它的語(yǔ)法定義好一個(gè)后綴為.proto的文件房轿,這個(gè)文件里面確定了用哪個(gè)版本的協(xié)議,有什么數(shù)據(jù)所森,具體的數(shù)據(jù)結(jié)構(gòu)以及每個(gè)字段是什么類(lèi)型囱持。然后將這個(gè)文件編譯生成對(duì)應(yīng)開(kāi)發(fā)語(yǔ)言的數(shù)據(jù)模型類(lèi),在實(shí)際的開(kāi)發(fā)中焕济,我們只需要把生成的模型類(lèi)拖到工程中纷妆,收到后端給的Protobuf二進(jìn)制數(shù)據(jù)后,調(diào)用SwiftProtobuf提供的序列化API即可晴弃。
所以掩幢,我們需要安裝一個(gè)把.proto文件轉(zhuǎn)為Swift文件的插件,蘋(píng)果在github的項(xiàng)目README文件里介紹了兩種安裝方式上鞠,自己編譯和Homebrew這里推薦Homebrew际邻,因?yàn)樗钍∈拢?/p>

// 打開(kāi)終端執(zhí)行以下命令即可:
brew install swift-protobuf

如果Homebrew沒(méi)有安裝或者裝不上又沒(méi)有時(shí)間折騰的話(huà),就只能自己編譯了芍阎。具體操作也很簡(jiǎn)單世曾,一共五個(gè)指令都在README里面,這里就不抄錄了谴咸,但有一點(diǎn)需要注意轮听,編譯的版本需要與最終iOS工程依賴(lài)的SwiftProtobuf版本一致。
編譯完成之后岭佳,需要配置環(huán)境變量血巍,protoc命令才能正常執(zhí)行。
進(jìn)入clone下來(lái)的swift-protobuf工程珊随,把隱藏文件打開(kāi)command + shift + .,然后進(jìn)入build/release藻茂,里面有一個(gè)protoc-gen-swift的可執(zhí)行文件,把它c(diǎn)opy到/usr/local/bin目錄下(這里比較坑,部分電腦配置了也找不到protoc命令辨赐,暫不知原因坎匿,Homebrew安裝快速便捷,這些步驟都可以省略)

三斯辰、Swift文件生成(保姆式教程)

//1救氯、打開(kāi)終端,創(chuàng)建一個(gè)文件夾
mkdir pbExample
//2、進(jìn)入創(chuàng)建的文件夾
cd pbExample
//3不恭、創(chuàng)建proto文件
touch pbExample.proto
//4叶雹、打開(kāi)新建的proto文件,編輯內(nèi)容
open pbExample.proto
//5换吧、將以下內(nèi)容copy進(jìn)proto文件
// 聰明的同學(xué)已經(jīng)知道這是什么了折晦,對(duì),它就是proto語(yǔ)法定義的一個(gè)數(shù)據(jù)結(jié)構(gòu)沾瓦,我們最終會(huì)用它來(lái)生成一個(gè)Swift的數(shù)據(jù)模型
// 去不了google的同學(xué)請(qǐng)自行baidu满着,資料很多

syntax = "proto3";

message BookInfo {
   int64 id = 1;
   string title = 2;
   string author = 3;
}
//6、保存關(guān)閉贯莺,然后生成Swift文件
protoc --swift_out=. pbExample.proto

//7风喇、如果執(zhí)行后沒(méi)有任何報(bào)錯(cuò),說(shuō)明已經(jīng)成功了缕探,執(zhí)行 ls 魂莫,你會(huì)看到一個(gè)
//pbExample.pb.swift的文件,把它拖到我們自己的iOS工程里面就可以正常使用了

四爹耗、iOS工程接入SwiftProtobuf

支持CocoaPods和SPM接入耙考,這里僅演示pod,SPM就不水字?jǐn)?shù)了潭兽。

// CocoaPods 1.7 or newer is required.
pod 'SwiftProtobuf'

然后我們把之前生成的pbExample.pb.swift文件拉入我們自己的工程琳骡,就進(jìn)入我們正常的開(kāi)發(fā)環(huán)節(jié)。
貼一段官方的Example:

// Create a BookInfo object and populate it:
var info = BookInfo()
info.id = 1734
info.title = "Really Interesting Book"
info.author = "Jane Smith"

// As above, but generating a read-only value:
let info2 = BookInfo.with {
    $0.id = 1735
    $0.title = "Even More Interesting"
    $0.author = "Jane Q. Smith"
  }

// Serialize to binary protobuf format:
let binaryData: Data = try info.serializedData()

// Deserialize a received Data object from `binaryData`
let decodedInfo = try BookInfo(serializedData: binaryData)

// Serialize to JSON format as a Data object
let jsonData: Data = try info.jsonUTF8Data()

// Deserialize from JSON format from `jsonData`
let receivedFromJSON = try BookInfo(jsonUTF8Bytes: jsonData)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讼溺,一起剝皮案震驚了整個(gè)濱河市楣号,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怒坯,老刑警劉巖炫狱,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剔猿,居然都是意外死亡视译,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)归敬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)酷含,“玉大人鄙早,你說(shuō)我怎么就攤上這事∫窝牵” “怎么了限番?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)呀舔。 經(jīng)常有香客問(wèn)我弥虐,道長(zhǎng),這世上最難降的妖魔是什么媚赖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任霜瘪,我火速辦了婚禮,結(jié)果婚禮上惧磺,老公的妹妹穿的比我還像新娘颖对。我一直安慰自己,他們只是感情好磨隘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布缤底。 她就那樣靜靜地躺著,像睡著了一般琳拭。 火紅的嫁衣襯著肌膚如雪训堆。 梳的紋絲不亂的頭發(fā)上描验,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天白嘁,我揣著相機(jī)與錄音,去河邊找鬼膘流。 笑死絮缅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呼股。 我是一名探鬼主播耕魄,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼彭谁!你這毒婦竟也來(lái)了吸奴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缠局,失蹤者是張志新(化名)和其女友劉穎则奥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體狭园,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡读处,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唱矛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罚舱。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡井辜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出管闷,到底是詐尸還是另有隱情粥脚,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布渐北,位于F島的核電站阿逃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赃蛛。R本人自食惡果不足惜恃锉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呕臂。 院中可真熱鬧破托,春花似錦、人聲如沸歧蒋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谜洽。三九已至萝映,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阐虚,已是汗流浹背序臂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留实束,地道東北人奥秆。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像咸灿,于是被迫代替她去往敵國(guó)和親构订。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容