乐趣区

关于即时通讯:IM通讯协议专题学习九手把手教你如何在iOS上从零使用Protobuf

本文作者:丁同舟,来自金蝶顺手记技术团队。

1、引言

接上篇《金蝶顺手记团队的 Protobuf 利用实际(原理篇)》,本文将以 iOS 端的 Objective- C 代码为例,图文并茂地向您菔救绾卧趇 OS 工程中疾速应用 Protobuf,心愿对你有帮忙。

学习交换:

  • 挪动端 IM 开发入门文章:《新手入门一篇就够:从零开发挪动端 IM》
  • 开源 IM 框架源码:https://github.com/JackJiang2…(备用地址点此)

(本文已同步公布于:http://www.52im.net/thread-41…)

2、系列文章

本文是系列文章中的第 9 篇,本系列总目录如下:
《IM 通信协定专题学习 (一):Protobuf 从入门到精通,一篇就够!》
《IM 通信协定专题学习(二):疾速了解 Protobuf 的背景、原理、应用、优缺点》
《IM 通信协定专题学习(三):由浅入深,从根上了解 Protobuf 的编解码原理》
《IM 通信协定专题学习(四):从 Base64 到 Protobuf,详解 Protobuf 的数据编码原理》
《IM 通信协定专题学习(五):Protobuf 到底比 JSON 快几倍?全方位实测!》
《IM 通信协定专题学习(六):手把手教你如何在 Android 上从零应用 Protobuf》(稍后公布..)《IM 通信协定专题学习(七):手把手教你如何在 NodeJS 中从零应用 Protobuf》
《IM 通信协定专题学习(八):金蝶顺手记团队的 Protobuf 利用实际(原理篇)》
《IM 通信协定专题学习(九):手把手教你如何在 iOS 上从零应用 Protobuf》(* 本文)
另外:如果您还打算系统地学习 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…,倡议养成浏览文档的习惯。

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/protocolbu…),因文章截图时用的是 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.h 和 Person.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”; //encodeNSDatadata = [p data];NSLog(@”Protocol Buffers:\n%@\nData: %@\nData Length: %lu”, p, data, data.length); //decodePerson *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: 23Decoded: <;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] 新手入门一篇就够:从零开发挪动端 IMCoffee time!

(本文已同步公布于:http://www.52im.net/thread-41…)

退出移动版