Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 494, comments - 13, trackbacks - 0, articles - 1
          本文作者:丁同舟,來自金蝶隨手記技術團隊。

          1、引言

          接上篇《金蝶隨手記團隊的Protobuf應用實踐(原理篇)》,本文將以iOS端的Objective-C代碼為例,圖文并茂地向您菔救綰臥趇OS工程中快速使用Protobuf,希望對你有幫助。

           

          學習交流:

          (本文已同步發布于:http://www.52im.net/thread-4133-1-1.html

          2、系列文章

          本文是系列文章中的第 9 篇,本系列總目錄如下:

          另外:如果您還打算系統地學習IM開發,建議閱讀《新手入門一篇就夠:從零開發移動端IM》。

          3、基本介紹

           

          Protobuf(全稱 Protocol buffers) 是 Google 提出的一種跨平臺、多語言支持且開源的序列化數據格式。相對于類似的 XML 和 JSON,Protobuf 更為小巧、快速和簡單。相對于傳統的 XML 和 JSON, Protobuf 的優勢主要在于:更加小、更加快,其語法目前分為proto2和proto3兩種格式。

          如果你沒不了解Protobuf是什么,建議先閱讀本系列的前幾篇《Protobuf從入門到精通,一篇就夠!》、《快速理解Protobuf的背景、原理、使用、優缺點》、《金蝶隨手記團隊的Protobuf應用實踐(原理篇)》,本篇就不再重復介紹了。

          目前 Google 官方的 Protobuf最新 release 版本為3.21.12,但本文寫作時用的是3.5.1,以下截圖都是基于此版本的環境搭建,如果你使用最新版本,差異并不大,因為只是小版本更新。

          關于 Protobuf的使用可以查閱官方文檔:https://developers.google.com/protocol-buffers/docs/overview,建議養成閱讀文檔的習慣。

          4、準備工作

          4.1環境要求

          最低開發環境要求:

          • 1)Objective-C 2.0 Runtime (32bit & 64bit iOS, 64bit OS X)
          • 2)Xcode 7.0 以上版本

          注意:Protobuf 出于性能考慮沒有使用 ARC,但在 ARC 下是可以使用的。

          4.2下載安裝

          下載 Protobuf 代碼包(https://github.com/protocolbuffers/protobuf/releases/tag/v21.12),因文章截圖時用的是v3.5.1,所以我這里的為了保持一致選擇的是 protobuf-objectivec-3.5.1.tar.gz,版本區別不大,建議依此類推。

          4.3解壓代碼包

          編譯 Protobuf,這里可能需要安裝部分工具:

          $ brew install autoconf

          $ brew install automake

          $ brew install libtool

          運行下面腳本進行編譯:

          $ ./autogen.sh

          $ ./configure

          $ make

          $ makeinstall

          檢查protobuf是否安裝成功:

          $ protoc --version

          如果成功打印版本號則安裝成功:

          libprotoc 3.5.1

          5、在 iOS 中使用 Protobuf

          5.1創建.proto文件

          這里使用官方文檔上的一份示例數據結構創建Person.proto:

          syntax = "proto3";

           

          message Person {

            string name = 1;

            int32 id = 2;

            string email = 3;

           

            enumPhoneType {

              MOBILE = 0;

              HOME = 1;

              WORK = 2;

            }

           

            message PhoneNumber {

              string number = 1;

              PhoneType type = 2;

            }

           

            repeated PhoneNumber phone = 4;

          }

          使用命令行編譯Person.proto為objective-c的文件,編譯出來的文件為Person.pbobjc.h和Person.pbobjc.m:

          protoc Person.proto --objc_out=./

          5.2引入 Protobuf 運行時資源

          Google 官方的文檔提供了兩種引入方式,但使用第一種的時候編譯不能通過,所以這里選擇了第二種。

          具體就是:復制protobuf目錄下的:objectivec/*.h, objectivec/google/protobuf/*.pbobjc.h, objectivec/google/protobuf/*.pbobjc.m, 以及除去 objectivec/GPBProtocolBuffers.m 后的objectivec/*.m。

          這里直接用命令行操作。

          首先進入protobuf下objectivec的目錄:

          $ cdprotobuf-3.5.1/objectivec

          然后復制符合規則的文件到指定的工程目錄下:

          $mkdir~/ProtobufDemo/ProtocolBuffers~/ProtobufDemo/ProtocolBuffers/google~/ProtobufDemo/ProtocolBuffers/google/protobuf

          $ cp*.h *.m ~/ProtobufDemo/ProtocolBuffers

          $ cpgoogle/protobuf/*.pbobjc.h google/protobuf/*.pbobjc.m ~/ProtobufDemo/ProtocolBuffers/google/protobuf

          注意:上面的命令并沒有排除 GPBProtocolBuffers.m 文件,引入時需要手動排除。

          現在把ProtocolBuffers目錄下所有文件以及上面編譯出來的 Person.pbobjc.h 和 Person.pbobjc.m 都引入到工程中。

          現在工程目錄結構大概是長這樣:

           

          注意:由于protobuf沒有使用 ARC,因此需要為所有.m文件加上-fno-objc-arc來關閉 ARC。

          結果如下:

          提示:需要留意工程中的 Header Search Paths 要增加 $(PROJECT_DIR)/ProtocolBuffers(具體的路徑視情況而定)

          5.3直接引入 ProtocolBuffers 工程

          如果覺得手動引入文件的方式過于復雜,可以直接引入ProtocolBuffers工程作為依賴項。

          1)進入解壓后的protobuf目錄下,復制objective目錄下的所有文件到ProtobufDemo/ProtocolBuffers目錄下。

          2)在ProtobufDemo工程中引入ProtocolBuffers_iOS工程:

          3)在Build Phases中加入依賴關系并鏈接庫:

           

          4)引入Person.pbobjc.hPerson.pbobjc.m文件并為.m加上-fno-objc-arc

          5)修改工程配置中部分路徑為 $(PROJECT_DIR)/ProtocolBuffers

          5.4運行測試

          首先引入頭文件:

          #import "Person.pbobjc.h"

          生成Person對象并進行編碼和解碼:

          Person *p = [[Person alloc] init];

          p.id_p = 1;

          p.name = @"person1";

          p.email = @"123@qq.com";

           

          //encode

          NSData*data = [p data];

          NSLog(@"Protocol Buffers:\n%@\nData: %@\nData Length: %lu", p, data, data.length);

           

          //decode

          Person *newP = [[Person alloc] initWithData:data error:nil];

          NSLog(@"Decoded: %@", newP);

          運行程序,打印日志如下:

          Protocol Buffers:

          <;Person 0x60c0000da2b0>: {

              name: "person1"

              id: 1

              email: "123@qq.com"

          }

          Data: <0a077065 72736f6e 3110011a 0a313233 4071712e 636f6d>

          Data Length: 23

          Decoded: <;Person 0x6040000d9c90>: {

              name: "person1"

              id: 1

              email: "123@qq.com"

          }

          6、參考資料

          [1] Protobuf 官方開發者指南(中文譯版)

          [2] Protobuf官方手冊

          [3] Protobuf從入門到精通,一篇就夠!

          [4] 如何選擇即時通訊應用的數據傳輸格式

          [5] 強列建議將Protobuf作為你的即時通訊應用數據傳輸格式

          [6] APP與后臺通信數據格式的演進:從文本協議到二進制協議

          [7] 面試必考,史上最通俗大小端字節序詳解

          [8] 移動端IM開發需要面對的技術問題(含通信協議選擇)

          [9] 簡述移動端IM開發的那些坑:架構設計、通信協議和客戶端

          [10] 理論聯系實際:一套典型的IM通信協議設計詳解

          [11] 58到家實時消息系統的協議設計等技術實踐分享

          [12] 金蝶隨手記團隊的Protobuf應用實踐(原理篇)

          [13] 新手入門一篇就夠:從零開發移動端IM

          Coffee time!

          (本文已同步發布于:http://www.52im.net/thread-4133-1-1.html



          作者:Jack Jiang (點擊作者姓名進入Github)
          出處:http://www.52im.net/space-uid-1.html
          交流:歡迎加入即時通訊開發交流群 215891622
          討論:http://www.52im.net/
          Jack Jiang同時是【原創Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
          本博文 歡迎轉載,轉載請注明出處(也可前往 我的52im.net 找到我)。


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          Jack Jiang的 Mail: jb2011@163.com, 聯系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 崇州市| 宝鸡市| 宾川县| 芦溪县| 澳门| 东方市| 仁化县| 静安区| 大兴区| 崇仁县| 沅江市| 手机| 乐山市| 娱乐| 庄河市| 苏尼特右旗| 沐川县| 龙里县| 化隆| 曲松县| 泸水县| 荥经县| 从江县| 吴川市| 东丰县| 灵寿县| 临洮县| 防城港市| 许昌县| 江都市| 荃湾区| 万州区| 双鸭山市| 乌拉特中旗| 吴旗县| 茌平县| 视频| 农安县| 会理县| 吐鲁番市| 万载县|