iOS即時通訊之網(wǎng)絡(luò)通信Protobuf

前言:
在不同平臺通信的時候辅辩,首先需要將對象進行序列化。在iOS平臺上我們經(jīng)常將數(shù)據(jù)處理為JSON或者XML格式用來數(shù)據(jù)交互坡垫。JSON和XML雖然由于容易維護殊鞭,易讀而應用比較廣泛,所以在HTTP短連接會使用這兩種數(shù)據(jù)傳輸格式数冬,但是對于長連接的即時通訊节槐,使用這兩種對數(shù)據(jù)的利用效率都不是高。所以Google提出了 Protocol Buffers(打開鏈接需翻墻) 作為一種跨平臺拐纱、語言無關(guān)的序列化數(shù)據(jù)格式铜异。Protocol Buffers提供代碼生成工具,能夠根據(jù)定義好的數(shù)據(jù)格式生成不同語言的代碼秸架,然后集成到項目中使用揍庄。Protocol Buffers目前有兩種格式:proto2和proto3。Protocol Buffers支持Java咕宿、Python币绩、C++、C#府阀、Go缆镣、Objective-C等代碼的生成。被大家廣泛推崇试浙。
說明:
·protobuf3.0.0以上才官方支持Objective-C董瞻,低于3.0.0的請忽略或者使用第三方轉(zhuǎn)換工具
·基于性能原因protobuf沒有使用ARC,但可以被ARC代碼調(diào)用田巴,文中有如何修改編譯方法

使用步驟:

1.轉(zhuǎn)換:將我們編寫好的XXX.proto文件轉(zhuǎn)成Objective-C文件钠糊,也就是XXX.h和XXX.m文件,轉(zhuǎn)換的工具是使用protoc這種二進制文件來生成的壹哺,這個文件需要自己生成抄伍,下面會介紹如何使用它來轉(zhuǎn)換Objective-C文件
2.集成:在iOS項目中加入protobuf庫和步驟1生成的OC文件

轉(zhuǎn)換

1.生成protoc
下載Protocol Buffers的源碼(下載地址),或者直接去下載面向objective-c的protobuf庫(下載地址)為,要下載對應Objective-C的版本比如 protobuf-objectivec-3.3.0.zip管宵,解壓截珍。 當然也可以到官網(wǎng)(需翻墻)下載。

編譯Protocol Buffers箩朴。生成重要的代碼生成工具(protoc)岗喉。由于Protocol Buffers編譯時使用了autoconf/automake/libtool等UNIX工具,Mac可能沒有自帶曲秉,需要手動安裝带猴』#可以使用Homebrew安裝。如果沒有安裝Homebrew的話查牌,一行代碼搞定,打開終端輸入:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

然后安裝需要的UNIX工具

brew install autoconf automake libtool

接下來cd到下載的目錄下拐格,依次執(zhí)行:

./autogen.sh
./configure
make
make check
sudo make install

再執(zhí)行

- objectivec/DevTools/full_mac_build.sh

執(zhí)行完后會看到src目錄下生成了protoc二進制文件
2.使用protoc轉(zhuǎn)換
創(chuàng)建proto文件僧免,比如Person.proto

syntax = "proto3";
message Person
{ 
    int32 age = 1;
    string username = 2;
    string phone = 3;
}

需要注意的是要指明proto的語法規(guī)則是proto2還是proto3
在src目錄(protoc所在目錄)執(zhí)行

protoc --proto_path=... --objc_out=... XXX.proto

其中proto_path是我們創(chuàng)建的proto文件所在目錄,objc_out為Objective-C文件輸出路徑,XXX.proto是我們創(chuàng)建的proto文件捏浊,可以一次轉(zhuǎn)換多個proto文件懂衩,加在XXX.proto后面即可。

舉例:我們在src目錄下新建兩個文件夾金踪,gen和protocols文件夾浊洞,gen為輸出目錄,protocols用于存放proto文件胡岔,將創(chuàng)建的Person.proto放在protocols文件夾下法希,執(zhí)行命令

protoc --proto_path=protocols --objc_out=gen protocols/Person.proto

然后在gen文件夾下就會生成Person.pbobjc.h和Person.pbobjc.m文件。

iOS中集成protobuf

1.將生成的Ojective-C文件(上面例子的Person.pbobjc.h和Person.pbobjc.m)放到項目中靶瘸,如果項目使用了ARC,要將.m(例子的Person.pbobjc.m)的Complier Flags設(shè)為-fno-objc-arc苫亦。(protobuf基于性能原因沒有使用ARC)現(xiàn)在應該都是使用的ARC了吧毛肋,所以這個是必須的。

修改編譯文件.jpeg

2.加入protobuf庫
這里有兩種方式
·第一種是使用CocoaPods集成

platform :ios, '7.1'
pod 'Protobuf', '~> 3.1.0'

需要注意的是 platform :iOS, ‘7.1’也就是7.1以上才能導入這個庫屋剑,不過現(xiàn)在最低支持到8了润匙,可以忽略
·第二種是把相關(guān)文件拖入項目中。
拖入相關(guān)文件到項目中唉匾,將objectivec文件夾下的所有的.h文件和.m文件(除了GPBProtocolBuffers.m)(GPB開頭的那些文件)以及整個google文件夾add到項目中孕讳,如果項目中使用了ARC需要將以上所有.m文件的的Complier Flags設(shè)為-fno-objc-arc。這種方法的優(yōu)點是靈活性強巍膘,沒有7.1的束縛厂财。缺點是操作麻煩點,如果用了ARC的話還要手動添加-fno-objc-arc(使用CocoaPods集成會自動添加)
第二種我沒試過峡懈,如果想省事璃饱,就用cocoapods吧
到此,就可以使用了:

簡單的使用

- (void)viewDidLoad {
[super viewDidLoad];
//編碼
Person *person = [[Person alloc] init];
person.age = 100; 
person.username = @"huang";
person.phone = @"10086";
NSData *data = [person data];

//解碼
Person *p = [Person parseFromData:data error:nil];
NSLog(@"person:%@",p);
}

參考博文:
iOS protobuf3.1.0使用
iOS網(wǎng)絡(luò)通信之Protobuf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肪康,一起剝皮案震驚了整個濱河市帜平,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梅鹦,老刑警劉巖裆甩,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異齐唆,居然都是意外死亡嗤栓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門箍邮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茉帅,“玉大人,你說我怎么就攤上這事锭弊】芭欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵味滞,是天一觀的道長樱蛤。 經(jīng)常有香客問我,道長剑鞍,這世上最難降的妖魔是什么昨凡? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蚁署,結(jié)果婚禮上便脊,老公的妹妹穿的比我還像新娘。我一直安慰自己光戈,他們只是感情好哪痰,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布遂赠。 她就那樣靜靜地躺著,像睡著了一般晌杰。 火紅的嫁衣襯著肌膚如雪解愤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天乎莉,我揣著相機與錄音,去河邊找鬼奸笤。 笑死惋啃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的监右。 我是一名探鬼主播边灭,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼健盒!你這毒婦竟也來了绒瘦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扣癣,失蹤者是張志新(化名)和其女友劉穎惰帽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體父虑,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡该酗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了士嚎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呜魄。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖莱衩,靈堂內(nèi)的尸體忽然破棺而出爵嗅,到底是詐尸還是另有隱情,我是刑警寧澤笨蚁,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布睹晒,位于F島的核電站,受9級特大地震影響括细,放射性物質(zhì)發(fā)生泄漏册招。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一勒极、第九天 我趴在偏房一處隱蔽的房頂上張望是掰。 院中可真熱鬧,春花似錦辱匿、人聲如沸键痛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽絮短。三九已至江兢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丁频,已是汗流浹背杉允。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留席里,地道東北人叔磷。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像奖磁,于是被迫代替她去往敵國和親改基。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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