iOS 集成Protobuf,转换proto文件

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

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

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;
}
  • 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 :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集成会自动添加),记得添加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

原文地址:https://www.cnblogs.com/feng9exe/p/8406396.html

时间: 2024-10-11 13:22:38

iOS 集成Protobuf,转换proto文件的相关文章

【protobuf进阶】通过.proto文件导出C#支持的.cs类文件

protobuf是一个跨平台的消息交互协议,类似xml.json等. protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.google 提供了多种语言的实现:java.c#.c++.go 和 python,每一种实现都包含了相应语言的编译器以及库文件.由于它是一种二进制的格式,比使用xml 进行数据交换快许多.可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换.作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输

protobuf引用其它proto文件

在一个proto文件中引用其它proto文件时,使用import "xx.proto"的方式,记得需要加上双引号,否则生成文件的时候会提示: Expected a string naming the file to import.

cocos2dx 3.8.1 lua集成protobuf

目前lua集成protobuf主要有两种方式 1. protobuf-gen-lua方案 https://github.com/sean-lin/protoc-gen-lua  参照说明即可集成 这个方案是将proto文件导出成lua文件, 使用起来稍微麻烦,  不能直接创建lua table,  而是要用生成lua pb文件中指定格式的table来生成二进制,  同样服务器返回的二进制数据也是反序列化成生成lua pb文件中指定格式的table. 对数组的操作与lua原生方式不一样, 没有良好

iOS 集成银联支付(绕过文档的坑,快速集成)

iOS 集成银联支付(绕过文档的坑,快速集成) 本文是投稿文章,作者:南栀倾寒当初集成支付宝的时候,觉得见了这么丑的代码,加上这么难找的下载地址,在配上几乎为零的文档,寒哥就要吐血了. 下午去集成银联,才知道血吐的早了. 下载地址:https://open.unionpay.com/upload/download/Development_kit85427986.rar 其实我找了半个小时 也不知道怎么就下载好了 这个我在Chrome的下载记录里找到的 解压之后会有这样的目录结构 Paste_Im

iOS集成支付宝

需要企业和支付宝签约这个是需要审核的[3天左右   以邮件形式告知你] 使用支付宝进行一个完整的支付功能,大致有以下步骤: 1>先与支付宝签约,获得商户ID(partner)和账号ID(seller) (这个主要是公司的负责) 2>下载相应的公钥私钥文件(加密签名用) 3>下载支付宝SDK(登录网站:http://club.alipay.com/)里面提供了非常详细的文档.如何签约.如何获得公钥私钥.如何调用支付接口. 4>生成订单信息 5>调用支付宝客户端,由支付宝客户端跟

iOS集成极光推送

iOS集成极光推送 一.配置APNs 苹果APNs(英文全称:Apple Push Notification Service) 1.配置开发证书 ![Uploading apns_13_803165.png -] 2.配置生产证书 和配置开发证书的流程相同. 3.将配置好的证书导出为 .p12 文件 一.注册极光推送帐号 可登录 极光推送官网 注册帐号. 注册成功后进入控制台 二.集成极光推送SDK sdk地址 我使用的是JPush-iOS-SDK-2.1.0.下载的文件里有个pdf文件iOS+

iOS 集成百度地图 位置偏移问题

iOS 集成百度SDK 请参考 百度地图官方文档 ,这里不就多啰嗦了 本文介绍的是在百度地图上根据经纬度,自定义气泡时,气泡位置的偏移,在我们天朝这种事是很常见的,也见怪不怪了,在项目中使用的百度地图的SDK,位置各种不对,百度地图和其他地图,如高德,他们都有自己的偏移算法,网上也有很多譬如 火星坐标转换之类的,都不能达到准备显示的效果. 其实百度SDK 有他自己偏移算法,使用百度偏移转换就可以了 BMKPointAnnotation *annotation = [[BMKPointAnnota

shareinstall之IOS集成

提示:以下代码(配置)由shareinstall根据当前应用动态生成,开发者可直接使用:按照以下步骤指引,10分钟即可完成IOS SDK集成.一.产品原理精确的App安装来源与携带参数安装 :shareInstall的核心价值在于,帮助Android/iOS开发者通过shareInstall提供的sdk,精确的获取app每一次安装的分享(或推广)来源.原理如下:开发者在分享的h5页面上集成 shareInstall web sdk,发布分享链接时在url上动态的拼接任意的自定义参数(如推广渠道号

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

一.创建Personproto.proto 创建Personproto.proto文件 syntax = "proto2"; package com.example.protobuf; option optimize_for = SPEED; option java_package = "com.example.sixthexample"; option java_outer_classname = "MyDataInfo"; message P