你的位置:首页 > 操作系统

[操作系统]iOS IM开发准备工作(二)protobuf


  Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准。你在http://code.google.com/p/protobuf/downloads/list 上可以下载 Protobuf 的源代码(然而需要FQ访问)。Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。也就是说OC版本的 Google本身没有提供,有哥们说,iOS可以直接用C++版本的,不过作为一个0警告的追求者,我不使用它。

  至于为什么用protobuf,说傻一点,boss让使用的。说高端一点,传输效率高,简洁。其实就是相同的流量可以传输更多的数据。据说wechat也是用的这个。

  protobuf-objc在Github上有几个开源的项目,我用的是这个https://github.com/alexeyxo/protobuf-objc。它里面的Readme写的还是很不好理解的,至少我进过坑。然后我发现了他 http://protobuf.io/#objc,这里面写的简洁,字体也比较舒服。

安装下载

第一种是用命令行下载源码安装插件,我喜欢这样的。

第一行  安装homebrew 这玩意还是比较有用的,安装一个无妨  如果这行报错,看看网络好不好

第二行  安装automake 下载完源码你会看到里面有makefile的,懂得人自然就懂了,不懂得就百度一下咯

第三行  安装libtool  一个通用库支持脚本,就看做GCC吧,还是为了make。不懂的还是问度娘

第四行  安装protobuf 

第五行  这一行命令你最好敲一下,不然你会后悔的 后面括号里面的就别输入命令行了

第六行  这个比较费时间

第七行  这是编译指令,需要你进入你根目录里面 下载好的那个protobuf-objc文件夹里面去执行

第八行  这一行是让你 把根目录下那个protobuf-objc文件夹里面的src目录下的runtime 里面的 这个ProtocolBuffers.xcodeproj项目 直接拖到你的项目里面去,(copy items) 

 

第二种CocoaPods不适合我这种直接的人+_+。。。

第一个方法的1到7 还是要的 后面3行 用pods的如果你不懂的话,面壁思过吧。。。

第三种 其实我发现的更直接的方法,在http://protobuf.io/#objc直接下载最顶上的压缩包

我不推荐这么做。如果你这么做失败了,那你还是前两种吧。。。

 

编译.proto

  安装好的,毕竟只是工具,用起来才行。proto的语法我就不说了,太多。我这里假设有人给了你.proto文件,现在你需要把他转成objc文件。

首先打开终端 cd到Desktop,这样便于观察操作结果;

然后输入这行 protoc --plugin=/usr/local/bin/protoc-gen-objc person.proto --objc_out=“./pbDir” 

  红色的是你的proto文件 我默认放在桌面了;蓝色的是你生成的文件要存放的目录  其中./是指当前目录下  pbDir  是我新建的文件夹 用来存放生成的objc文件的

  每个proto文件会生成两个文件 一个.h  一个.m

最后将你的生成的文件 拖到你的项目里面去 然后就可以用了。

 

简说proto的Message

  proto文件里面每一个包都是一个message。我写一个比较全的例子,说明一下。

 1 message MTMsg  2 { 3   enum Type 4   { 5     ax = 0; 6     ay = 1; 7     aa = 2; 8     ab = 3; 9   }10   required Type ntype = 1;11   repeated TKSMsg objs = 2 ;12   optional string name = 3 ;13 }  

  可以看出,这一个message里面 有一个枚举,是不是很神奇。再看第一个变量 它是一个枚举类型的字段,前面的required表示它是必填字段;第二个变量,是一个自定义的TKSMsg(它也是一个message),前面的repeated表示他是一个数组类型;最后一个是一个字符串string,optional表示他是可选字段。

  编译出来后,这段message会变得很大,我就不贴出来了。

  编译后,你可以用XXXBuilder 来alloc出来一个实例a,对这个a的属性赋值。然后用这个a.build 给出一个XXX的实例b。这个b可以用来传输。