Protobuf是Google公司内部的混合语言数据标准,全称是Google Protocol Buffer,Protobuf是一种更小、更快、更简单的结构化数据存储格式,可用于序列化返回数据,目前已经支持生成Java,Python,Objective-C,C++代码。本文将介绍如何将Proto文件编译为Obj-C源码文件,方便在iOS和Mac平台上面,使用Xcode开发并存储解析Protobuf文件。
如何将Proto文件编译为Obj-C源码文件?
如果要在苹果iOS或者Mac开发过程中需要用到.pbobjc.h和.pbobjc.m文件,这些文件都是使用Protobuf编译工具(protoc命令)根据.proto后缀文件编译生成的。
1. 检查自己的Mac电脑内是否有protoc命令,打开终端输入一下命令。
$protoc -h
2. 如果没有,就需要编译和安装protoc命令文件
这里两种方案:
1. 进入Google Protobuf项目,自己下载、编译和安装;
下载地址:https://github.com/protocolbuffers/protobuf/releases
里面选择protobuf-objectivec-xxxx.zip文件下载,再找一下网上的教程编译完成。
2. 直接下载protoc命令文件后,手动将下载的protoc可执行命令文件复制到/usr/local/bin/文件夹下面。
下载地址:https://github.com/protocolbuffers/protobuf/releases
里面选择protoc-xxxx-osx-x86_64.zip文件下载。
或者,下载CSDN上传的,v3.12.4版本,下载地址:https://download.csdn.net/download/aogufeixue/12691484
$open /usr/local/bin/
注意,启动protoc命令文件,可能需要打开‘系统设置’进入‘安全和隐私’去允许打开非验证的app。
3. 如果有protoc命令,接下来就可以用它将.proto后缀的文件转换为Obj-C文件。
比如我桌面pb文件夹下面有个SubCmdPrinterMsg.proto,使用以下命令转换。
$cd /Users/James/Desktop/pb/
$protoc --objc_out=./ ./SubCmdPrinterMsg.proto
4. 最后将可以将.pbobjc.h和.pbobjc.m文件,复制加入到xcode工程项目里面
最后注意,在xcode里面使用.pbobjc.h和.pbobjc.m文件需要导入Google的一个库,可以使用Pod导入,在Podfile文件里面加入
pod 'Protobuf'
最后执行Pod Install命令:
pod install --verbose --no-repo-update
最终就可以在Xcode里面正常编译和使用Google Protocol Buffer,可以保存和解析Google的二进制数据格式。
// 创建
Person *person = [[Person alloc] init];
person.age = 100;
person.name = @"Feixue";
// 存储
NSData *pdata = [person data];
// 解析
Person *p = [Person parseFromData:pdata error:nil];
NSLog(@"person:%@",p);
这里还需要注意的地方是:生成的protoc执行命令文件版本要和Pod上面的版本一致,否则会报错:
#if GOOGLE_PROTOBUF_OBJC_VERSION < 30002
#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
#endif
#if 30002 < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
#endif
比如,查看protoc的版本:
$protoc --version
$libprotoc 3.12.4
在Pod里面查看版本是3.10.2,这样就出现编译错误警告。
pod 'Protobuf' , '~> 3.10.0'
所有最好是转换.proto的protoc和Pod库版本一致。