本文作者:丁同舟,來自金蝶隨手記技術(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)系并鏈接庫: