蘋(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)