运行 Telegram 的 iOS 开源项目

概述

Telegram 是一个IM软件,卖点很多,这里就不过多介绍了。主要说说它在 GitHub 上的开源。
Telegram作为一个非盈利性的项目,除了免费提供体验一流的即时通讯和具备强大扩展性的机器人服务外,还在 GitHub 上开源了几个客户端的源码,iOS 客户端也在此列,虽然版本没跟上App Store的就是了。

Clone 源码

iOS 端的 GitHub地址是 https://github.com/peter-iakovlev/Telegram
下回来后看到是下面这一坨

4e9ea6764fd79250

加载依赖

留意到项目根目录里有个 submodule 和 workspace,没有Podfile文件,这项目外部依赖估计都是拖进去的,一些要独立开发更新的依赖就以git的子模块添加,搜了一下加载子模块的命令,在当前目录运行

1
git submodule update --init --recursive

然而……

3e272c0f5877f57a

Telegram 你开源的项目,你给的依赖,现在告诉我没权限下依赖?

超纲了超纲了,iOS 还没遇到过用git的子模块来管理依赖的,根正苗红的CocoaPods不好用吗?

但自己下的项目,含泪也要把它跑起来,用Sublime Text打开项目目录看看

bc166c4c4dfe97c5

古人云,格物致知,我一看gitmodules里最后加密协议那个妖艳贱货就跟别的依赖不一样,于是改成

7c23ebdcbe44f486

然后运行

1
2
git submodule sync
git submodule update --init --recursive

f6c51356b6a8b200

配置

用 xcode 打开项目跑一下,结果

b4eb95c8e5eed43e

无尽唏嘘……

不过在 Finder 里能找到,拖进去,全局把 #import "../../config.h" 改成 #import "config.h"

编译,结果……

45d3873f6dbcee7d

麻木了……

显然这是个宏,但项目里找不到定义,这个宏应该是给appid赋值。

项目下回来后我一直有个疑问,作为一个完整度这么高,用户量这么大的项目,API真的能让开源乱搞吗?到这里看到appid就豁然开朗了。

到 Telegram 参观一圈后,发现要到这里 https://my.telegram.org/auth 登录,提醒一下,手机号码前要加上 +86,接着就得获得下面这玩意

40061a962fe7f38d

看来还有apihash要搞

从上图可以看到,还可以上传apns证书,这样你自己签名的Telegram也能让Telegram官方给你推送了。

把下面的宏定义写到刚才的config.h文件中,appid和hash替换成自己申请的

1
2
3
4

#define SETUP_API_ID(apiId) apiId = 29xxx5;
#define SETUP_API_HASH(apiHash) apiHash = @"4130dc225cfd513xxxx8fbbbfe559";

编译成功

8b3ed7620f55551b

跑起来就花了半天,主要是不熟悉git的submodules,如果有这方面知识的话,不用半小时就能跑起来了

这项目文件非常多,用过 Telegram 的都知道,这应用非常简洁,但细节多多,我统计了一下,整个项目大概20万行代码,完整编译一次要 3 分钟左右,我这台机器可不是mba,其实是E3V2 CPU、 16G内存的黑苹果,性能稍弱于15年15寸顶配MBP。