.pbobjc.h和.pbobjc.m文件的生成

一、Protocol Buffers

1、簡介

Protocol Buffers是google出的用來序列化和反序列化數據的工具。google提供了多種語言的實現:Java、C#、C++、Go 、 Python、Objective-C,每一種實現都包含了相應語言的編譯器以及庫文件。由于它是一種二進制的格式,比使用XML進行數據交換快許多,可以把它用于分布式應用之間的數據通信或者異構環(huán)境下的數據交換。作為一種效率和兼容性都很優(yōu)秀的二進制數據傳輸格式,可以用于諸如網絡傳輸、配置文件、數據存儲等諸多領域。

2、說明

  • protobuf3.0.0以上才官方支持Objective-C

  • 環(huán)境:基于性能原因沒有使用ARC,但可以被ARC代碼調用

個人理解pb就是一個序列化和反序列化的工具,數據交換格式。

至于什么是序列化反序列化,在代碼里的展現形式就是:

- (GCDAsynSocketModel *)buildCoordinateRequestHeartBeatBody
{
    User *user = [UserManager sharedInstace].usr;
    UpDriverPosition *driverPosition = [[UpDriverPosition alloc] init];
    driverPosition.driverId = user.ID;//1
    driverPosition.longitude = self.locationInfo.longitude;//2
    driverPosition.latitude = self.locationInfo.latitude;//3
    
    SInt32 positionType = [[NSString stringWithFormat:@"%lu",(unsigned long)0] intValue];
    driverPosition.positionType = positionType;//4

    driverPosition.speed = self.locationInfo.speed;//5
    driverPosition.bearing = 0.0000;//6
    driverPosition.altitude = self.locationInfo.altitude;//7
    
    driverPosition.cityNo = self.locationInfo.citycode;//8
    
    NSString *cityString = [ZTool safeString:self.locationInfo.city];
    driverPosition.cityName = cityString;//9
    
    NSDate *timeSpDate = self.locationInfo.timestamp;
    NSString *timeSp = [NSString stringWithFormat:@"%f", [timeSpDate timeIntervalSince1970]];
    SInt64 upTimestamp = [[NSString stringWithFormat:@"%@",timeSp] intValue];
    driverPosition.upTimestamp = upTimestamp;//11
    
    SInt32 carLevel = [[NSString stringWithFormat:@"%lu",(unsigned long)1] intValue];
    driverPosition.carLevel = carLevel;//12
    
    GCDAsynSocketModel *asynSocketModel = [[GCDAsynSocketModel alloc]init];
    asynSocketModel.businessType = DDGCDAsynSocketConfigBusinessTypeSpecialCar;
    asynSocketModel.commandID = DDSocketCommandIDDriverPosition;
    asynSocketModel.moduleID = DDGCDAsynSocketConfigModuleIDDriver;
    NSData *data = driverPosition.data;
    asynSocketModel.transmissionData = data;
    return asynSocketModel;
}

這個方法就是將一些信息序列化后,存儲在一個model里面并返回。

二、pb在iOS中的使用

由.proto文件生成OC代碼里能使用的.h和.m文件,即xxx.proto轉化成xxx.pbobjc.h和xxx.pbobjc.m。

1、pbobjc.h和.pbobjc.m生成環(huán)境

如果沒有裝autoconf automake libtool需要先裝這幾個,這里使用brew來安裝,在shell執(zhí)行 brew install autoconf automake libtool即可,如果沒有brew先安裝brew。

(1)安裝homebrew

homebrew介紹

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
(2)用homebrew安裝automake、libtool和protobuf

依次在終端執(zhí)行如下命令:
brew install automake
brew install libtool
brew install protobuf

2、生成.pbobjc.h和.pbobjc.m

iOS開發(fā)中在用到tcp長鏈接的時候,需要生成.pbobjc.h和.pbobjc.m文件。

拿到.proto文件,將.proto用記事本或者Sublime打開,記得需要指明proto的語法規(guī)則是proto2還是proto3,如下圖:

proto.png

下載面向Objective-C的protobuf庫,地址為(https://github.com/google/protobuf/releases),要下載對應Objective-C的版本比如 protobuf-objectivec-3.1.0.zip,解壓。

解壓后打開找到objectivec的文件,cd到該文件夾下,然后將objectivec--DevTools-->full_mac_build.sh
將full_mac_build.sh直接拖拽到終端,回車就可以了。

等日志pass打印完畢后,在終端生成.pbobjc.h和.pbobjc.m

我是在桌面上生成.pbobjc文件,所以如下操作:

cd ~/Desktop

protoc --proto_path=. --objc_out=. UpDriver.proto

生成的文件也就保存在了桌面上。

生成命令說明:

protoc --proto_path=. --objc_out=. UpDriver.proto
  • protoc 為proto的生成指令 后面添加 參數, 參數的形式為: --參數命令名=參數
  • --proto_path=. 指出proto文件所在的根目錄是哪里, 如果用.說明是當前目錄
  • --objc_out=. 指出 生成目錄在哪里, 如果用.說明是當前目錄
  • UpDriver.proto是你的proto文件名稱

備注:

  • 需要注意的事 proto 里面需要指出pb語法的版本; 如 syntax = "proto2"; 有 optional 關鍵字 說明是 proto2版本。
  • 生成的.h語.m文件只能使用OC的MRC模式,暫時不支持ARC。所以引入項目后需要添加-fno-objc-arc。

3、pbobjc.h和.pbobjc.m使用

(1)集成protobuf庫

使用 pod集成:

 pod 'Protobuf'

手動集成:

將objectivec文件夾下的所有的.h文件和.m文件(除了GPBProtocolBuffers.m)(GPB開頭的那些文件)以及整個google文件夾add到項目中,如果項目中使用了ARC需要設置-fno-objc-arc。

這種方法操作麻煩點,如果用了ARC的話還要手動添加-fno-objc-arc(使用CocoaPods集成會自動添加),記得添加User Header Search Paths為$(PROJECT_DIR)/項目名/后接文件地址 不然頭文件會報錯。

(2)引入xxx.pbobjc.h和xxx.pbobjc.m

將生成的xxx.pbobjc.h和xxx.pbobjc.m文件放入項目中,并添加-fno-objc-arc。

參考文檔:http://blog.csdn.net/sdsd13212/article/details/62044348

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

推薦閱讀更多精彩內容