最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(九):手把手教你如何在iOS上從零使用Protobuf

2023-02-14 12:48 作者:nickkckckck  | 我要投稿

本文作者:丁同舟,來(lái)自金蝶隨手記技術(shù)團(tuán)隊(duì)。

1、引言

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

?

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

- 移動(dòng)端IM開(kāi)發(fā)入門(mén)文章:《新手入門(mén)一篇就夠:從零開(kāi)發(fā)移動(dòng)端IM》

- 開(kāi)源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK(備用地址點(diǎn)此)

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

2、系列文章

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

  • 《IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(一):Protobuf從入門(mén)到精通,一篇就夠!》

  • 《IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(二):快速理解Protobuf的背景、原理、使用、優(yōu)缺點(diǎn)》

  • 《IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(三):由淺入深,從根上理解Protobuf的編解碼原理》

  • 《IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(四):從Base64到Protobuf,詳解Protobuf的數(shù)據(jù)編碼原理》

  • 《IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(五):Protobuf到底比JSON快幾倍?全方位實(shí)測(cè)!》

  • 《IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(六):手把手教你如何在Android上從零使用Protobuf》(稍后發(fā)布..)

  • 《IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(七):手把手教你如何在NodeJS中從零使用Protobuf》

  • 《IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(八):金蝶隨手記團(tuán)隊(duì)的Protobuf應(yīng)用實(shí)踐(原理篇)》

  • 《IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(九):手把手教你如何在iOS上從零使用Protobuf》(* 本文)

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

3、基本介紹

?

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

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

目前 Google 官方的?Protobuf最新 release 版本為3.21.12,但本文寫(xiě)作時(shí)用的是3.5.1,以下截圖都是基于此版本的環(huán)境搭建,如果你使用最新版本,差異并不大,因?yàn)橹皇切“姹靖隆?/p>

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

4、準(zhǔn)備工作

4.1環(huán)境要求

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

  • 1)Objective-C 2.0 Runtime (32bit & 64bit iOS, 64bit OS X)

  • 2)Xcode 7.0 以上版本

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

4.2下載安裝

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

4.3解壓代碼包

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

$ brew install autoconf

$ brew install automake

$ brew install libtool

運(yùn)行下面腳本進(jìn)行編譯:

$ ./autogen.sh

$ ./configure

$ make

$ makeinstall

檢查protobuf是否安裝成功:

$ protoc --version

如果成功打印版本號(hào)則安裝成功:

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的文件,編譯出來(lái)的文件為Person.pbobjc.h和Person.pbobjc.m:

protoc Person.proto --objc_out=./

5.2引入 Protobuf 運(yùn)行時(shí)資源

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

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

這里直接用命令行操作。

首先進(jìn)入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

注意:上面的命令并沒(méi)有排除 GPBProtocolBuffers.m 文件,引入時(shí)需要手動(dòng)排除。

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

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

?

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

結(jié)果如下:

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

5.3直接引入 ProtocolBuffers 工程

如果覺(jué)得手動(dòng)引入文件的方式過(guò)于復(fù)雜,可以直接引入ProtocolBuffers工程作為依賴(lài)項(xiàng)。

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

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

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

?

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

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

5.4運(yùn)行測(cè)試

首先引入頭文件:

#import "Person.pbobjc.h"

生成Person對(duì)象并進(jìn)行編碼和解碼:

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);

運(yùn)行程序,打印日志如下:

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

[2]?Protobuf官方手冊(cè)

[3]?Protobuf從入門(mén)到精通,一篇就夠!

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

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

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

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

[8]?移動(dòng)端IM開(kāi)發(fā)需要面對(duì)的技術(shù)問(wèn)題(含通信協(xié)議選擇)

[9]?簡(jiǎn)述移動(dòng)端IM開(kāi)發(fā)的那些坑:架構(gòu)設(shè)計(jì)、通信協(xié)議和客戶(hù)端

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

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

[12]?金蝶隨手記團(tuán)隊(duì)的Protobuf應(yīng)用實(shí)踐(原理篇)

[13]?新手入門(mén)一篇就夠:從零開(kāi)發(fā)移動(dòng)端IM

Coffee time!

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

IM通訊協(xié)議專(zhuān)題學(xué)習(xí)(九):手把手教你如何在iOS上從零使用Protobuf的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
吴堡县| 灵山县| 沙河市| 苏尼特左旗| 尼勒克县| 昂仁县| 航空| 建瓯市| 外汇| 石家庄市| 上杭县| 长汀县| 淮安市| 汉川市| 织金县| 太白县| 和硕县| 星子县| 神木县| 大城县| 志丹县| 建水县| 金阳县| 通辽市| 隆林| 定兴县| 炎陵县| 老河口市| 弥渡县| 东安县| 定襄县| 锦州市| 四子王旗| 五大连池市| 宜春市| 岗巴县| 新郑市| 建始县| 巫溪县| 西乌珠穆沁旗| 思南县|