Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准。你在http://code.google.com/p/protobuf/downloads/list 上可以下载 Protobuf 的源代码(然而需要翻墙访问)。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 这玩意还是比较有用的,安装一个无妨 如果这行报错,看看网络好不好;截图的地址错了,应为:ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
第二行 安装automake 下载完源码你会看到里面有makefile的,懂得人自然就懂了,不懂得就百度一下咯
第三行 安装libtool 一个通用库支持脚本,就看做GCC吧,还是为了make。不懂的还是问度娘
第四行 安装protobuf
第五行 这一行命令你最好敲一下,不然你会后悔的 后面括号里面的就别输入命令行了
第六行 这个比较费时间;截图的地址又改了,应为:git clone https://github.com/alexeyxo/protobuf-objc.git
第七行 这是编译指令,需要你进入你根目录里面 下载好的那个protobuf-objc文件夹里面去执行,截图又是错的,(我也是醉了) 应为:./scripts/build.sh
第八行 这一行是让你 把根目录下那个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可以用来传输。