iOS 使用protobuf(一)環境的配置

? ? ? ? 由于公司需要做智能設備的項目,據說用的是socket+protobuf來進行相互交互!,由于自己從來沒有做過這方面的東西,沒辦法!就硬著頭皮去研究。

? ? ? ?關于protobuf的介紹,網上很多。

? ? ? ? 因為谷歌沒有為mac系統提供專用的系統的庫,雖然c++庫可以使用,但是個人覺得不是很方便。所以,使用編譯成oc能夠直接調用的。

配置protobuf需要HomeBrew工具或則是MacPort。如沒有安裝,則需要配置HomeBrew工具或則是MacPort。

步驟1(環境配置前的準備工作):

? ? ? ? ?1:使用HomeBrew?

? ? ? ? ? ? ? brew install autoconf

? ? ? ? ? ? ? ?brew install automake

? ? ? ? ? ? ? ?brew install libtool

? ? ? ? 2:使用MacPort(使用了HomeBrew,請忽視這一步。當然也可以執行這一步)

? ? ? ? ? ? ? ?sudo port install autoconf automake libtool

步驟2(下載谷歌的protobuf庫):

? ? ? ? ? ?下載基于c++的protobuffer:protobuffer

步驟3(生成將.proto文件編譯成oc類的工具):

? ? ? ? ?1: cd到下載下來的文件的目錄(以下的步驟需要在vpn的情況下進行處理,如果沒有開通,網上有解決方法)

? ? ? ? ? 例如cd/Users/macxu/Desktop/protobuf-master

? ? ? ? ? 2:輸入

? ? ? ? ? ?./autogen.sh

? ? ? ? ? ?3:輸入

? ? ? ? ? ?./configure

? ? ? ? ? ?4:輸入

? ? ? ? ? make

? ? ? ? ? # 如果希望安裝protoc,執行下面的命令 ?

? ? ? ? ? ?make install

? ? ? (最好生成編譯工具)

步驟4(工程中使用protobuf):

? ? 1:創建proto文件指定數據格式,可以選擇proto2和proto3格式,它們有些細微的區別,在生成代碼的時候會提示的,具體情況查看文檔LanguageGuide proto3。下面使用proto3格式,并且保存為Person.proto。(請在windows環境下生成以下的文本,mac平臺下好像不能夠生成。編譯成oc的時候好像會報錯)

syntax = "proto3";

message ? Person {

? ? ? ? ? ?string name = 1;

? ? ? ? ? int32 uid = 2;

? ? ? ? ? string email = 3;

? ? ? ? ?enum PhoneType {

? ? ? ? ? ? ? ?MOBILE = 0;

? ? ? ? ? ? ? HOME = 1;

? ? ? ? ? ? ? WORK = 2;}

message PhoneNumber {

? ? ? ? ? ?string number = 1;

? ? ? ? ? ?PhoneType type = 2;}

repeated PhoneNumber phone = 4;}

2:使用protoc工具生成Objective-C代碼。其中--proto_path=后跟需要處理的proto文件所在的文件夾,--objc_out=指明生成的是Objective-C代碼以及目標文件存放路徑,最后是需要處理的文件。(objc_out表示生成oc下的文件)

protoc --proto_path=. --objc_out=. Person.proto

3:處理完成后,生成兩個文件,分別是Person.pbobjc.h和Person.pbobjc.m。這兩個文件是采用的手動引用計數,因此在加入項目后需要設置它們的編譯參數。

-fno-objc-arc

4:為了方便管理,我們直接將Protocol Buffers中的iOS靜態庫項目引入進來

(ps:里面有可能會有mac下的工程,請手動刪除)(最好在新建的工程目錄下新建一個文件夾,用來添加需要添加的工程例如protoTool文件夾)。

5:在工程下面添加靜態庫項目,

6:設置依賴和連接庫。

7:記得設置Header Search Paths或者User Header Search Paths。將在本地所在的文件的上一層文件夾的路徑添加進來。

現在就可以和使用普通的oc類一樣使用Person.pbobjc.h。

8:具體的使用代碼:

Person *person = [[Person alloc] init];

person.name= @"Zhangsan";

person.email= @"diveinedu@qq.com";

person.uid=23;

NSData *data = [person data];

NSString*path = @"/Users/apple/Desktop/test.data";

[data writeToFile:path atomically:YES];

NSData *ldata = [NSData dataWithContentsOfFile:path];

Person *p = [Person parseFromData:ldata error:nil];

ps:添加原生的庫的時候有可能遇到問題的解決辦法:

1:以前沒有直接添加過帶靜態庫的項目。添加的時候直接將需要添加的項目拖進去是不對的,不對的,不對。應該用add files來添加。

2:添加header search時,出現找不到路徑的問題。需要添加被添加工程所在路徑的上一層文件夾的路徑。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容