gRPC是google开源的一个跨平台网络层解决方案,旨在提高移动端网络层的性能,提升移动端网络层的开发效率,基于pb3.0和http2.0等最时髦的技术,目前版本是0.13,已经进入了beta版本。更多的简介,可以参考这里:
http://skyao.github.io/leaning-grpc/
这两天参照google的文档,折腾了一下gRPC的demo,十分的辛酸,整理一下提供大家参考。
gRPC下面有两个oc的demo,分别位于grpc/src/objective-c/examples/Sample和grpc/examples/objective-c/helloworld,他们的区别是前者是连google的RPC服务,后者是连本地的RPC服务。两个项目的build方法并没有太大的不同。
先看helloworld,在官网的文档第一页会看到Usage。不过还是到github上面看最保险,传送门如下
https://github.com/grpc/grpc/tree/release-0_13/examples/objective-c/helloworld
$ git clone https://github.com/grpc/grpc.git
$ cd grpc
$ git submodule update --init
如果遇到了错误,多半是因为还没有安装proto和相关的工具导致的。到官网看一下安装教程,或者直接gem或者brew安装就好了
如果在安装proto的时候遇到这个错误
Can't exec "aclocal": No such file or directory at
/usr/local/share/autoconf/Autom4te/FileUtils.pm line 326.
可以参考这篇文章处理
http://blog.csdn.net/ldl22847/article/details/8572406
安装automake即可
如果在执行make的时候遇到这个错误
+ autoreconf -f -i -Wall,no-obsolete
Can't exec "glibtoolize": No such file or directory at /usr/local/Cellar/autoconf/2.69/share/autoconf/Autom4te/FileUtils.pm line 345, line 6.
autoreconf: failed to run glibtoolize: No such file or directory
autoreconf: glibtoolize is needed because this package uses Libtool
通过brew安装libtool即可
继续gRPC的helloworld之旅,按照如下的方法开启本地服务
$ pushd ../../cpp/helloworld
$ make
$ ./greeter_server &
$ popd
查看任务管理器,发现有一个greeter_server的进程即表示开启成功
pod的时候,推荐
$ pod install --verbose --no-repo-update
因为pod依赖的都是本地的源码,无须到服务器update,会快很多
pod的时候一般会遇到这个错误
Got the following message:
protoc-gen-objcgrpc: program not found or is not executable
--objcgrpc_out: protoc-gen-objcgrpc: Plugin failed with status code 1.
这个错误的意思是,找不到protoc-gen-objcgrpc这个插件的位置,无法生成对应的pb类。在一番google下找到了处理的方法
https://groups.google.com/forum/#!topic/grpc-io/wosw_PPcwBI
这篇帖子的意思是,找到出错的podspec文件,在对应的位置修改,譬如helloworld需要修改HelloWorld.podspec文件,将
protoc -I #{src} --objc_out=#{dir} --objcgrpc_out=#{dir} #{src}/helloworld.proto
修改为
protoc -I #{src} --objc_out=#{dir} --grpc_out=#{dir} --plugin=protoc-gen-grpc=/usr/local/bin/grpc_objective_c_plugin #{src}/helloworld.proto
即可
注意,如果不写上--grpc_out=#{dir},则只会生成pbobjc文件,而不会生成pbrpc文件,相当于gRPC的service部分没法用了。
对于Sample这个demo来说,将会在RemoteTestClient这个podspec报错,按照上文的方式修改即可