蘋果在github的SwiftProtobuf地址:https://github.com/apple/swift-protobuf
懶得看的直接去按照蘋果的文檔操作即可(不過(guò)可能有坑,見下文)
這篇文章的目的,是想簡(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)制的,要為上層開發(fā)者所用就得對(duì)應(yīng)的語(yǔ)言支持解析了,而在iOS這邊,谷歌官方只實(shí)現(xiàn)了OC的解析,并沒(méi)有支持Swift的解析。。。。。。
but,蘋果官方親自出馬實(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è)字段是什么類型。然后將這個(gè)文件編譯生成對(duì)應(yīng)開發(fā)語(yǔ)言的數(shù)據(jù)模型類,在實(shí)際的開發(fā)中,我們只需要把生成的模型類拖到工程中,收到后端給的Protobuf二進(jìn)制數(shù)據(jù)后,調(diào)用SwiftProtobuf提供的序列化API即可。
所以,我們需要安裝一個(gè)把.proto文件轉(zhuǎn)為Swift文件的插件,蘋果在github的項(xiàng)目README文件里介紹了兩種安裝方式,自己編譯和Homebrew這里推薦Homebrew,因?yàn)樗钍∈拢?/p>
// 打開終端執(zhí)行以下命令即可:
brew install swift-protobuf
如果Homebrew沒(méi)有安裝或者裝不上又沒(méi)有時(shí)間折騰的話,就只能自己編譯了。具體操作也很簡(jiǎn)單,一共五個(gè)指令都在README里面,這里就不抄錄了,但有一點(diǎn)需要注意,編譯的版本需要與最終iOS工程依賴的SwiftProtobuf版本一致。
編譯完成之后,需要配置環(huán)境變量,protoc命令才能正常執(zhí)行。
進(jìn)入clone下來(lái)的swift-protobuf工程,把隱藏文件打開command + shift + .,然后進(jìn)入build/release,里面有一個(gè)protoc-gen-swift的可執(zhí)行文件,把它c(diǎn)opy到/usr/local/bin目錄下(這里比較坑,部分電腦配置了也找不到protoc命令,暫不知原因,Homebrew安裝快速便捷,這些步驟都可以省略)
三、Swift文件生成(保姆式教程)
//1、打開終端,創(chuàng)建一個(gè)文件夾
mkdir pbExample
//2、進(jìn)入創(chuàng)建的文件夾
cd pbExample
//3、創(chuàng)建proto文件
touch pbExample.proto
//4、打開新建的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)入我們正常的開發(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)