iOS下 安裝Protobuf(ProtocolBuffers)的詳細步驟,解決網上出現的所有問題

weixin_34236869發表於2018-06-13

Protobuf是什麼?

Protobuf 即 google protocol buffer 是一種資料封裝格式協議,是google推出
的一種語言無關、平臺無關、擴充套件性好的用於通訊協議、資料儲存的結構化資料序列化方法。支援
C++、Python、Java三種語言。

為什麼要使用Protobuf?

在不同平臺通訊的時候,首先需要將物件進行序列化。iOS平臺上我們常用NSKeyedArchiver進行
歸檔,當然也可以將資料處理為JSON或者XML格式。NSKeyedArchiver只能在iOS/Mac平臺使用,
因此它歸檔的二進位制資料不適合於在不同平臺之間使用。JSON和XML雖然由於容易維護,易讀而應用
比較廣泛,但是對資料的利用效率都不是高。這時候該使用Protobuf了,因為Protobuf的優勢是
效率高,同樣的一份資料使用protobuf儲存的時候更小,更加方便

安裝步驟如下:

一.安裝環境 

    1.開啟終端
    2.檢視你的mac上是否安裝了brew
      $ brew -v
      Homebrew 1.6.8
      Homebrew/homebrew-core (git revision d822; last commit 2018-06-12)
     這是表明已經安裝,如果沒有安裝,使用下面的命令安裝下

   3.安裝brew (使用ruby安裝)
      $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/
   Homebrew/install/master/install)"

   4.下載依賴庫(工具)
       $ brew install automake
       $ brew install libtool

   5.下載Protobuf
       $ brew install protobuf

   6.克隆protobuf-objc,也就是說吧程式碼下載到本地
      $ cd desktop 我是clone到桌面,你們可以隨便放那
      $ git clone https://github.com/alexeyxo/protobuf-objc.git

    7.執行指令碼
        $  cd ~/protobuf-objc    切換到clone的目錄

        $  ./scripts/build.sh
     或者這樣
        $ ./autogen.sh
        $ ./configure
        $ make
        # 如果希望安裝protoc,執行下面的命令
        $ make install

      編譯後報錯:In file included from objc_helpers.cc:27:./google/protobuf/
     objectivec-descriptor.pb.h:17:2: error: This file was generated by 
      an older version of protoc which is 
      #error This file was generated by an older version of protoc which is
      ^
      ./google/protobuf/objectivec-descriptor.pb.h:18:2: error: incompatible with your
      Protocol Buffer headers. Please
    #error incompatible with your Protocol Buffer headers. Please
      ^
     ./google/protobuf/objectivec-descriptor.pb.h:19:2: error: regenerate this file
     with a newer version of protoc.
   #error regenerate this file with a newer version of proton.
    ......
出現這樣的錯誤,不要慌,這是google自己版本的問題,我們不用管他,而且也不會像其他文章說的那
樣,生成protoc-gen-objc這個外掛,根本就不會生成,除非版本是2.6.0,這個問題採用下面的方式
一樣能生成proto檔案

二.生成字尾proto的檔案
說明: 建立 proto 檔案指定資料格式,可以選擇proto2和proto3格式,它們有些細微的區別,在生成程式碼的時候會提示的,具體情況檢視文件Language Guide proto3。下面使用proto3格式,並且儲存為person.proto。

  1.  建立檔案person.proto
      $  cd desktop  我還是切換到桌面
      $  touch person.proto
  2. 編輯person.proto檔案
      2.1 使用終端編輯
           $ vi person.proto
              syntax = "proto3";
              message Person{
              string name = 1;
               int32 age = 20;
             enum DeviceType{
                      iOS = 0;
                     Android = 1;
                  }
              }
        2.2 放到xcode中直接寫(推薦)

三.轉化成objc檔案

由於我們生成不了protoc-gen-objc,因此使用
protoc --plugin=/usr/local/bin/protoc-gen-objc  --objc_out=./ person.proto這種方式是不行的

我們使用 protoc 工具生成Objective-C程式碼:
終端輸入: $ protoc --proto_path=A --objc_out=B person.proto

其中--proto_path=後跟A是需要處理的proto檔案所在的資料夾,--objc_out=指明生成的是
Objective-C程式碼以及目標檔案存放路徑,B是目標檔案存放路徑,person.proto是需要處理的檔案。

這時候我們就生成了2個檔案,如下圖


2819141-e0450509c5e6b3cf.png
objc-proto檔案

匯入工程中,這兩個檔案是採用的手動引用計數,因此在加入專案後需要設定它們的編譯引數。


2819141-0a4fea888be6403c.png
設定

四.專案使用 (下載Protocol Buffers的原始碼(下載地址),也可以到官網上下載)

 1.使用cocoapods方式匯入
    pod  'Protobuf'  而不是   pod 'ProtocolBuffers',      
    使用 pod 'ProtocolBuffers'
    下載成功之後,編譯一看,結果報錯 
    #import "GPBProtocolBuffers_RuntimeSupport.h"無法找到
2819141-388d0ee739a9b077.png
報錯
  原因是pods下來的是不帶GPB的,所以網上說的不對,應該是用
pod 'Protobuf' ,這樣就沒有問題
 
 2.靜態庫引入方式 
     1.下載Protocol Buffers的原始碼 
     2.工程裡引入ProtocolBuffers_iOS.xcodeproj,或者編譯成靜態庫.a方式,然後公開標頭檔案(如圖2)
     3.設定依賴和連線庫。(如圖3)
     4.引入標頭檔案(如圖4)
2819141-8dd0cc6463e1779e.png
圖2
2819141-a321b01e44b8845b.png
圖3

2819141-7e4ac659a0d519b5.png
圖4

參考文章

https://my.oschina.net/kgdugyiy/blog/538333 安裝和使用
https://developers.google.com/protocol-buffers/ 語法方面
https://github.com/google/protobuf/blob/master/src/README.md 官網教程
至於如何使用,下期文章會詳細介紹,並提供demo,喜歡的,點下贊,謝謝!

相關文章