iOS 集成Protobuf,转换proto文件

Posted 小球why

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 集成Protobuf,转换proto文件相关的知识,希望对你有一定的参考价值。

Protobuf简介

Protocol Buffer是google 的一种数据交换的格式,已经在Github开源,目前最新版本是3.1.0。它独立于语言,独立于平台。google 提供了多种语言的实现:Java、C#、C++、Go 和 Python,Objective-C,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 XML 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

说明

  • protobuf3.0.0以上才官方支持Objective-C,低于3.0.0的请忽略或使用第三方转换工具
  • 开发环境:32bit & 64bit ios, 64bit OS X,Xcode7.0+
  • 基于性能原因没有使用ARC,但可以被ARC代码调用

步骤

  1. 转换:将我们编写好的XXX.proto文件转成Objective C文件,也就是XXX.h和XXX.m文件,转换的工具是使用protoc这种二进制文件来生成的,这文件需要自己生成,稍后会介绍如何使用它来转换Objective-C文件
  2. 集成:如果在iOS项目中加入protobuf库以及步骤1生成的OC文件

转换

生成protoc

如果没有装autoconf automake libtool需要先装这几个,这里使用brew来安装,在shell执行 brew install autoconf automake libtool即可,如果没有brew请自行先安装brew。
下载面向Objective-C的protobuf库,地址为(https://github.com/google/protobuf/releases),要下载对应Objective-C的版本比如 protobuf-objectivec-3.1.0.zip,解压。

cd到下载的目录,依次执行:

  • $ ./autogen.sh
  • $ ./configure
  • $ make
  • $ make check
  • $ sudo make install

再执行
- objectivec/DevTools/full_mac_build.sh

执行完后会看到src目录下生成了protoc二进制文件

使用protoc转换

创建proto文件,比如Person.proto

syntax = "proto3";
message Person
{ 
    int32 age = 1;
    string username = 2;
    string phone = 3;
}

需要注意的是要指明proto的语法规则是proto2还是proto3。
在src目录(protoc所在目录)执行

protoc --proto_path=... --objc_out=... XXX.proto

其中proto_path是我们创建的proto文件所在目录,objc_out为Objective-C文件输出路径,XXX.proto是我们创建的proto文件,可以一次转换多个proto文件,加在XXX.proto后面即可。

举例:我们在src目录下新建两个文件夹,gen和protocols文件夹,gen为输出目录,protocols用于存放proto文件,将创建的Person.proto放在protocols文件夹下,执行命令

protoc --proto_path=protocols --objc_out=gen protocols/Person.proto

然后在gen文件夹下就会生成Person.pbobjc.h和Person.pbobjc.m文件。

集成

将生成的Ojective-C文件(上面例子的Person.pbobjc.h和Person.pbobjc.m)放到项目中,如果项目使用了ARC,要将.m(例子的Person.pbobjc.m)的Complier Flags设为-fno-objc-arc。(protobuf基于性能原因没有使用ARC)

加入protobuf库,有两种方式

  • 第一种是使用CocoaPods集成

    • 使用CocoaPods集成,有一个现成的pod可以使用–Protobuf,可以pod search Protobuf搜索查看详情,pod内容为
      platform :ios, '7.1'
      pod 'Protobuf', '~> 3.1.0'

    需要注意的是 platform :ios, ‘7.1’
    7.1及以上才能导入这个库,这种方式优点是操作简单,缺点是platform :ios, ‘7.1’ 要7.1或以上

  • 第二种是把相关文件拖入项目中。

    • 拖入相关文件到项目中,将objectivec文件夹下的所有的.h文件和.m文件(除了GPBProtocolBuffers.m)(GPB开头的那些文件)以及整个google文件夹add到项目中,如果项目中使用了ARC需要将以上所有.m文件的的Complier Flags设为-fno-objc-arc。这种方法的优点是灵活性强,没有7.1的束缚。缺点是操作麻烦点,如果用了ARC的话还要手动添加-fno-objc-arc(使用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);
}

以上是关于iOS 集成Protobuf,转换proto文件的主要内容,如果未能解决你的问题,请参考以下文章

Netty集成Protobuf与多协议消息传递

[专栏作家] Protobuf-net使用ProtoGen批量转换成cs文件

Protobuf 编译工具转换 Java 类

2020-04-09vue中使用protobuf

protobuf(Protocol Buffers).proto文件中的IDL(Interface Definition Language 接口定义语言)是什么?

protobuf-dt 与 protoc 的集成不起作用