前言:
在不同平臺通信的時候辅辩,首先需要將對象進行序列化。在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了吧毛肋,所以這個是必須的。
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);
}