? ? ? ? 由于公司需要做智能設(shè)備的項目,據(jù)說用的是socket+protobuf來進行相互交互!,由于自己從來沒有做過這方面的東西,沒辦法!就硬著頭皮去研究。
? ? ? ?關(guān)于protobuf的介紹,網(wǎng)上很多。
? ? ? ? 因為谷歌沒有為mac系統(tǒng)提供專用的系統(tǒng)的庫,雖然c++庫可以使用,但是個人覺得不是很方便。所以,使用編譯成oc能夠直接調(diào)用的。
配置protobuf需要HomeBrew工具或則是MacPort。如沒有安裝,則需要配置HomeBrew工具或則是MacPort。
步驟1(環(huán)境配置前的準(zhǔn)備工作):
? ? ? ? ?1:使用HomeBrew?
? ? ? ? ? ? ? brew install autoconf
? ? ? ? ? ? ? ?brew install automake
? ? ? ? ? ? ? ?brew install libtool
? ? ? ? 2:使用MacPort(使用了HomeBrew,請忽視這一步。當(dāng)然也可以執(zhí)行這一步)
? ? ? ? ? ? ? ?sudo port install autoconf automake libtool
步驟2(下載谷歌的protobuf庫):
? ? ? ? ? ?下載基于c++的protobuffer:protobuffer
步驟3(生成將.proto文件編譯成oc類的工具):
? ? ? ? ?1: cd到下載下來的文件的目錄(以下的步驟需要在vpn的情況下進行處理,如果沒有開通,網(wǎng)上有解決方法)
? ? ? ? ? 例如cd/Users/macxu/Desktop/protobuf-master
? ? ? ? ? 2:輸入
? ? ? ? ? ?./autogen.sh
? ? ? ? ? ?3:輸入
? ? ? ? ? ?./configure
? ? ? ? ? ?4:輸入
? ? ? ? ? make
? ? ? ? ? # 如果希望安裝protoc,執(zhí)行下面的命令 ?
? ? ? ? ? ?make install
? ? ? (最好生成編譯工具)
步驟4(工程中使用protobuf):
? ? 1:創(chuàng)建proto文件指定數(shù)據(jù)格式,可以選擇proto2和proto3格式,它們有些細(xì)微的區(qū)別,在生成代碼的時候會提示的,具體情況查看文檔LanguageGuide proto3。下面使用proto3格式,并且保存為Person.proto。(請在windows環(huán)境下生成以下的文本,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代碼以及目標(biāo)文件存放路徑,最后是需要處理的文件。(objc_out表示生成oc下的文件)
protoc --proto_path=. --objc_out=. Person.proto
3:處理完成后,生成兩個文件,分別是Person.pbobjc.h和Person.pbobjc.m。這兩個文件是采用的手動引用計數(shù),因此在加入項目后需要設(shè)置它們的編譯參數(shù)。
-fno-objc-arc
4:為了方便管理,我們直接將Protocol Buffers中的iOS靜態(tài)庫項目引入進來

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

5:在工程下面添加靜態(tài)庫項目,

6:設(shè)置依賴和連接庫。


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

現(xiàn)在就可以和使用普通的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:以前沒有直接添加過帶靜態(tài)庫的項目。添加的時候直接將需要添加的項目拖進去是不對的,不對的,不對。應(yīng)該用add files來添加。
2:添加header search時,出現(xiàn)找不到路徑的問題。需要添加被添加工程所在路徑的上一層文件夾的路徑。