CocoaAsyncSocket 网络通信使用之Protobuf安装(五)

CocoaAsyncSocket网络通信使用之Protobuf安装(五) 

Protocol Buffers是Google推出的工具,主要用来处理数据的序列化和反序列化,能够针对数据的不同类型做压缩存储,从而减少网络数据传输的大小。

一般我们在写数据协议的时候,都需要针对不同的平台实现多次数据解析方法,而Protocol Buffers的另一个功能就是一次模版定制,多平台编译使用。

Protocol Buffers原生支持c++、java、python,可以在ios上使用c++版混编代码,但是编译过程比较麻烦,我们这里在ios中使用第三方的库(oc版本)。

来源地址:https://github.com/alexeyxo/protobuf-objc


安装Protocol Buffers

1. 先检查自己的mac上是否有安装Homebrew。使用命令:brew -v

[objc]  view plain  copy
 
  1. zhuruhongdeMacBook-Pro:ios zhuruhong$ brew -v  
  2. Homebrew 0.9.5 (git revision 30c54; last commit 2016-02-16)  

2. 如果你还没有安装,请使用下面的命令安装

[objc]  view plain  copy
 
  1. ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  


3. 安装好Homebrew后,我们接下来安装必须的相关工具。依次执行以下命令:

[html]  view plain  copy
 
  1. brew install automake  
  2. brew install libtool  
  3. brew install protobuf  

注意:我之前安装过protobuf,中间出了以下错误。告诉我not linked,处理过程如下:

[html]  view plain  copy
 
  1. zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$ brew install protobuf  
  2. Warning: protobuf-2.6.1 already installed, it's just not linked  
  3. zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$   
  4. zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$ brew link protobuf  
  5. Linking /usr/local/Cellar/protobuf/2.6.1...   
  6. Error: Could not symlink include/google/protobuf/compiler/code_generator.h  
  7. Target /usr/local/include/google/protobuf/compiler/code_generator.h  
  8. already exists. You may want to remove it:  
  9.   rm '/usr/local/include/google/protobuf/compiler/code_generator.h'  
  10.   
  11. To force the link and overwrite all conflicting files:  
  12.   brew link --overwrite protobuf  
  13.   
  14. To list all files that would be deleted:  
  15.   brew link --overwrite --dry-run protobuf  
  16. zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$   
  17. zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$ brew link --overwrite protobuf  
  18. Linking /usr/local/Cellar/protobuf/2.6.1... 70 symlinks created  
  19. zhuruhongdeMacBook-Pro:protobuf-objc zhuruhong$   

其中brew link --overwrite protobuf命令可能失败,应该没有权限覆盖对应的protocol目录中的文件权限,请逐个修改后,重试命令。


4. 为了能够在任意目录使用protoc命令,我们为protoc创建一个快捷链接。当然这个是可选的,你可以自己配置环境变量也能达到同样的效果。以下是链接命令:

[objc]  view plain  copy
 
  1. ln -s /usr/local/Cellar/protobuf/2.6.1/bin/protoc /usr/local/bin  


5. 接下来,我们从git上拉取protobuf的oc版本工程,存放目录随自己喜好。命令如下:

[objc]  view plain  copy
 
  1. git clone https://github.com/alexeyxo/protobuf-objc.git  


6. 编译刚刚拉取的protobuf-objc工程,进入protobuf-objc工程目录,依次执行如下命令

[objc]  view plain  copy
 
  1. ./autogen.sh  
  2. make  
  3. make install  

注意:如果第3步的安装和链接失败,在第6步可能就不能成功了。我碰到了如下错误,多次研究后,终于发现原因是第3步未linked造成的。

[objc]  view plain  copy
 
  1. ./google/protobuf/descriptor.pb.h:2840:50: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'  
  2.   if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {  
  3.                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^  
  4. ./google/protobuf/descriptor.pb.h:2848:50: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'  
  5.   if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {  
  6.                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^  
  7. ./google/protobuf/descriptor.pb.h:2856:50: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'  
  8.   if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {  
  9.                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^  
  10. ./google/protobuf/descriptor.pb.h:2864:50: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'  
  11.   if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {  
  12.                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^  
  13. ./google/protobuf/descriptor.pb.h:2872:50: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'  
  14.   if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) {  
  15.                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^  
  16. ./google/protobuf/descriptor.pb.h:2876:75: error: no member named 'GetEmptyStringAlreadyInited' in namespace 'google::protobuf::internal'  
  17.     package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited());  
  18.                                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^  
  19. fatal error: too many errors emitted, stopping now [-ferror-limit=]  
  20. 20 errors generated.  

7. 编写.proto文件,即数据结构的描述文件,这里不多说,直接上测试文件内容.

[objc]  view plain  copy
 
  1. message Person {  
  2.     required int32 id = 1;  
  3.     required string name = 2;  
  4.     optional string email = 3;  
  5. }  

8. 利用protoc命令将.proto文件编译成object-c代码。

[objc]  view plain  copy
 
  1. protoc --objc_out=./ Person.proto    //oc版本,我们这里只要这个  
  2. protoc --cpp_out=./ *.proto            //c++版本  
  3. proton —java_out=./ *.proto          //java版本  

9. protobuf在ios中的使用。

[objc]  view plain  copy
 
  1. 在Podfile加入oc版本的protocol buffers运行时库:  
  2. pod 'ProtocolBuffers', '~> 1.9.9.2’  

10. 使用Person对象

引入Person.pb.h,Person.pb.m文件,编译运行工程

demo:https://github.com/zhu410289616/RHSocketKit

服务端工程demo:RHSocketServerDemo

客户度工程demo:RHSocketKitDemo

email: [email protected]

qq: 410289616

qq群:330585393

2016.2.25

你可能感兴趣的:(iOS)