博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 集成Protobuf,转换proto文件
阅读量:6973 次
发布时间:2019-06-27

本文共 2639 字,大约阅读时间需要 8 分钟。

原文地址:http://blog.csdn.net/hyq4412/article/details/54891038

附加Homebrew安装地址:https://brew.sh/index_zh-cn.html

 

Protobuf简介

Protocol Buffer是google 的一种数据交换的格式,已经在开源,目前最新版本是3.1.0。它独立于语言,独立于平台。google 提供了多种语言的实现:、C#、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库,地址为(),要下载对应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; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

需要注意的是要指明proto的语法规则是proto2还是proto3。 

在src目录(protoc所在目录)执行

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

其中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
  • 1
  • 1

然后在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'
      • 1
      • 2
      • 1
      • 2

    需要注意的是 platform :, ‘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集成会自动添加),记得添加User Header Search Paths为$(PROJECT_DIR)/项目名/后接文件地址 不然头文件会报错

简单使用

直接上代码

- (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); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
你可能感兴趣的文章
Java面试题集(六)
查看>>
DCHP是什么意思
查看>>
Pytorch 0.3加载0.4模型及其之间版本的变化
查看>>
apt-get 更换源
查看>>
数据库路由中间件MyCat - 源代码篇(2)
查看>>
go异常处理原则
查看>>
左侧固定,右侧自适应的布局方式理解margin负值理论
查看>>
Roman numerals/Encode - Rosetta Code
查看>>
高质量C++/C编程指南
查看>>
数据持久化Nbear使用经验分享(一)附NBearLite源码和测试Demo
查看>>
usp10.dll和lpk.dll病毒如何处理
查看>>
FPGA同步复位,异步复位以及异步复位同步释放实例分析
查看>>
窗体传值
查看>>
《转》从程序员到项目经理(五):不是人人都懂的学习要点
查看>>
如何让做好领导助理工作
查看>>
跟我一起云计算(3)——hbase
查看>>
vim与外部文件的粘帖复制
查看>>
3、数字签名
查看>>
Entity Framework DBFirst尝试
查看>>
dd测试硬盘性能
查看>>