<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jack Jiang

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

    1、引言

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

     

    學(xué)習(xí)交流:

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

    2、系列文章

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

    另外:如果您還打算系統(tǒng)地學(xué)習(xí)IM開發(fā),建議閱讀《新手入門一篇就夠:從零開發(fā)移動端IM》。

    3、基本介紹

     

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

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

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

    關(guān)于 Protobuf的使用可以查閱官方文檔:https://developers.google.com/protocol-buffers/docs/overview,建議養(yǎng)成閱讀文檔的習(xí)慣。

    4、準備工作

    4.1環(huán)境要求

    最低開發(fā)環(huán)境要求:

    • 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,版本區(qū)別不大,建議依此類推。

    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創(chuàng)建.proto文件

    這里使用官方文檔上的一份示例數(shù)據(jù)結(jié)構(gòu)創(chuàng)建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 官方的文檔提供了兩種引入方式,但使用第一種的時候編譯不能通過,所以這里選擇了第二種。

    具體就是:復(fù)制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

    然后復(fù)制符合規(guī)則的文件到指定的工程目錄下:

    $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 文件,引入時需要手動排除。

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

    現(xiàn)在工程目錄結(jié)構(gòu)大概是長這樣:

     

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

    結(jié)果如下:

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

    5.3直接引入 ProtocolBuffers 工程

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

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

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

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

     

    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 官方開發(fā)者指南(中文譯版)

    [2] Protobuf官方手冊

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

    [4] 如何選擇即時通訊應(yīng)用的數(shù)據(jù)傳輸格式

    [5] 強列建議將Protobuf作為你的即時通訊應(yīng)用數(shù)據(jù)傳輸格式

    [6] APP與后臺通信數(shù)據(jù)格式的演進:從文本協(xié)議到二進制協(xié)議

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

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

    [9] 簡述移動端IM開發(fā)的那些坑:架構(gòu)設(shè)計、通信協(xié)議和客戶端

    [10] 理論聯(lián)系實際:一套典型的IM通信協(xié)議設(shè)計詳解

    [11] 58到家實時消息系統(tǒng)的協(xié)議設(shè)計等技術(shù)實踐分享

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

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

    Coffee time!

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



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


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


    網(wǎng)站導(dǎo)航:
     
    Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
    主站蜘蛛池模板: 亚洲精品无播放器在线播放| 亚洲视频在线不卡| 18禁亚洲深夜福利人口| 成人毛片视频免费网站观看| 亚洲中文无码a∨在线观看| **一级毛片免费完整视| 亚洲电影免费观看| AV大片在线无码永久免费| 香蕉大伊亚洲人在线观看| 亚洲性69影院在线观看| 国产国产人免费视频成69堂| 亚洲人成在线免费观看| 男男AV纯肉无码免费播放无码| 亚洲一区精彩视频| 全黄a免费一级毛片人人爱| 九九免费精品视频在这里 | 免费爱爱的视频太爽了 | 亚洲成人在线免费观看| 1000部拍拍拍18免费网站| 77777亚洲午夜久久多喷| 成人人观看的免费毛片| 美女视频黄.免费网址| 国产自偷亚洲精品页65页| 午夜视频在线免费观看| 亚洲一卡2卡3卡4卡乱码 在线| 国产做床爱无遮挡免费视频| 国产特黄特色的大片观看免费视频| 久久久久久a亚洲欧洲aⅴ| 在线看片v免费观看视频777| 亚洲色偷精品一区二区三区| 亚洲国产日韩在线观频| 人人玩人人添人人澡免费| 国产精品亚洲玖玖玖在线观看 | 国产亚洲美女精品久久久| 1000部拍拍拍18勿入免费视频下载| 亚洲码和欧洲码一码二码三码| 亚洲人午夜射精精品日韩| 国产免费一区二区三区| 五月天国产成人AV免费观看| 亚洲综合在线视频| 又爽又高潮的BB视频免费看|