解除编译自己的iOS版Telegram-电报telegram技巧分享

telegramios代码怎么编译

排除 Telegram iOS 群组频道封禁限定

2019 – 05 – 15


Posted by Frederic Chan

由于 App Store 的内容考核政策,Telegram iOS 许多群组(尤其 NSFW 群组)都无法进入,部分正常的群也遭到屏蔽,而安卓和 PC/Mac 端不受影响,这还是带来了一些不方便。鉴于 telegram 的代码是开源的,于是我实验通过修改代码的方法来绕过限定。

Telegram X 是官方使用 Swift 语言写的新的 Telegram 客户端,相比于原版越发丝滑流畅。由于原版的 Telegram iOS 已经六个月没有更新代码了,而 Telegram X 正在保持稳定的开发步调,从久远来看我们还是修改新出的 Telegram X 比较好。

下载代码

首先我们从 GitHub 下载代码,项目地点是 https://github.com/peter-iakovlev/Telegram-iOS 。

然后进入目次,下载 git 子模块:

git submodule update --init --recursive

。 然后打开 XCode 的 workspace。

申请 API Key

你需要在 https://my.telegram.org/auth 申请一个 API Key 以和服务器进行通讯。

运行代码

在开始修改之前,我们先实验运行一下。首先选择 target 为 Telegram-iOS-Fork。

修改 target

更换 API Key

然后来到 Telegram-IOS/Supporting Files/BuildConfig.m,将 275 到 331 行的代码更换为如下代码:


_apiId = 123456; _apiHash = @"aaaabbbbccccddddeeeeffffededeeee"; _hockeyAppId = nil;

此中,apiId 和 apiHash 为上一步官网申请时得到的。

实在单看提示来看是缺了一个 APP_CONFIG_DATA,它是包含了 apiId、apiHash 和 hockeyAppId 的一个 hex,但是并不知道怎样将这三个值变成一个 hex。以是临时只能更换代码。 GitHub 上有关于这个的讨论 。

修改前

修改后

XCode 10.2 兼容性问题

假如你是用的 XCode 版本是 10.2,你大概会碰到这个问题,不然你可以跳过这个步骤。在 XCode 10.2 中,会出现 Swift 3 到 Swift 4 的兼容性问题,详细体现是 ManagedAudioSession.swift 中有一个 Expression type ‘Bool’ is ambiguous without more context 的告诫。GitHub 上也有 对应的 issue 。现在只能把那一行解释掉来解决问题。

解释代码

运行

完成以上步骤后,我们就可以点击左上角的播放按钮来编译运行了。不出意外你可以看到编译成功并弹出 iOS 模仿器窗口。登录后你会发现此时频道屏蔽依然有用。

修改代码

在自己开始上手之前,我曾经在群里问过有没有人实验过。有一个人说自己实验过而且成功了,不外他使用的是原版的 Telegram 客户端。根据他的描述,原版客户端的代码逻辑比较易读,只需要修改以下几个地方即可:




可以看到业务逻辑非常清楚易读,只需要去掉

hasExplicitContent

的判定即可。不外在 Telegram X 中好像没有这么荣幸,这段代码在 Telegram X 中并不存在,因此我被迫寻找别的出路。

经过不停地调试,我最后在 API 调用的反序列化步骤中参加了代码,通过位运算修改了服务器返回的群组的属性实现了频道解禁。

修改的位置在 TelegramCore/Network/Api1.swift 的

parse_channel

函数中,我们在读取流的操作之后(1733行)参加位运算代码,将从右数的第九位和第十八位置零,并清空

_9



_12

的内容:


_1 = _1! & ~(1 << 9) & ~(1 << 18) _9 = nil _12 = nil

这时间我们再编译运行,可以看到 channel 屏蔽已经排除。

真机调试

到这里实在我们只完成了一半:如今只能在模仿器里运行,而由于苹果的限定,真机运行非常麻烦。

假如你没有苹果开发者账号(99刀一年),你会无法使用包括通知推送在内的很多功能

。在进行下面的步骤之前,你需要先在 XCode 中登录自己的 Apple ID。

取消没有权限的 capabilities

对于我们的免费证书,许多功能都不能使用。为了通过编译,我们需要把这些“本领”关掉。在左侧列表中点击“Telegram-iOS”、在右边的 target 列表中选择 “Telegram-iOS”,然后在 Capabilities 选项卡中关掉 Associated Domains、iCloud、Push notifications、Siri。

封闭后

别的,还需要通过修改代码封闭 Siri 的授权申请,不然运行时会白屏卡住。详细的做法是将 AppDelegate.swift 中的 Siri 授权逻辑部分由判定逻辑直接改成拒绝状态。

修改前

修改后

使用自己的证书对 App 署名

对于

全部的 targets

,在 signing 区块中勾选 Automatically manage signing。

然后在每一个 targets 的 Build settings 中的 signing 区块中清空 Code Signing Entitlements。

清空 Code Signing Entitlements

自定义 Bundle Identifier

把每一个 target 的 bundle identifier 都改掉。除了 Telegram-iOS 之外,其他的 target 的 bundle identifier 应该以 Telegram-iOS 的 bundle identifier 为前缀。好比假如 Telegram-iOS 的新 bundle identifier 是“pro.admirable.telegram”,则 Share 的新 bundle identifier 应该设置为“pro.admirable.telegram.Share”。

除此之外,还需要去每一个 target 里的 build settings 选项卡中,修改 User-defined 下的 APP_BUNDLE_ID 为 Telegram-iOS 的 bundle identifier:

修改 APP_BUNDLE_ID

自定义 App Group

在 Target “Telegram-iOS”的 capabilities -> App Groups 中新建一个 App Groups,名字自己起(

疑似必须与“Telegram-iOS”的 Bundle identifier 保持同等,不然运行时会黑屏出现 Error 2 错误,不确定是否为 XCode 的 bug

。这个问题坑了我好几个小时。)。然后封闭 App Groups 功能再重新打开,然后选择你方才新建的项目。接下来的每一个 target 都需要

先封闭 App Groups 功能再重新打开,然后选择你方才新建的项目

除此之外,你还需要前去每一个 target 的 build settings,然后将 User-defined -> Provisioning profile 清空。不然 App Groups 列表下面会有告诫。

清空 Provisioning profile

运行

在完成了以上步骤之后,我们就可以运行了。点击播放图标。经过编译的過逞后,telegram 就安装到了你的手机上。为了运行你署名的应用程序,你需要在 iPhone 上前去设置->通用->描述文件,然后信托你自己的开发者证书。

后记

对于我这个后端,使用 XCode 修改 iOS 项目还是有点难度的。经过了许多个小时的斗(keng)争,终于实现了频道(channel)屏蔽的排除。不确定对于群组(group)是否有用,欢迎在评述区留言讨论。


Telegram 是一款近两年非常火的多平台客户端开源聊天软件.

既然客户端是开源的那么我计划自己编译一下来看看.

网上已经有了一些编译Telegram的信息,但这些信息大概由于代码更新基本都不可用了.

拉代替码


git clone https://github.com/peter-iakovlev/Telegram-iOS.git cd Telegram-iOS/ # Telegram-iOS 很大部分的功能都是通过submodule来提供的,以是还需要拉取submodule git submodule update --init --recursive

拉取完成以后用Xcode打开项目,结果发现许多submodule是丢失的.

结果打开submodule文件发现居然许多module的url都指向一个相对路径…



[

submodule

"submodules/AsyncDisplayKit"


]

path

=

submodules/AsyncDisplayKit

url


=

../AsyncDisplayKit.git

[

submodule

"submodules/Display"


]

path

=

submodules/Display

url


=

../Display.git

[

submodule

"submodules/HockeySDK-iOS"


]

path

=

submodules/HockeySDK-iOS

url


=

../HockeySDK-iOS.git

[

submodule

"submodules/libtgvoip"


]

path

=

submodules/libtgvoip

url


=

https://github.com/grishka/libtgvoip.git

[

submodule

"submodules/lottie-ios"


]

path

=

submodules/lottie-ios

url


=

../lottie-ios.git

[

submodule

"submodules/MtProtoKit"


]

path

=

submodules/MtProtoKit

url


=

../MtProtoKit.git

[

submodule

"submodules/Postbox"


]

path

=

submodules/Postbox

url


=

../Postbox.git

[

submodule

"submodules/SSignalKit"


]

path

=

submodules/SSignalKit

url


=

../Signals.git

[

submodule

"submodules/TelegramCore"


]

path

=

submodules/TelegramCore

url


=

../TelegramCore.git

[

submodule

"submodules/TelegramUI"


]

path

=

submodules/TelegramUI

url


=

../TelegramUI.git

[

submodule

"submodules/ffmpeg"


]

path

=

submodules/ffmpeg

url


=

../ffmpeg.git

[

submodule

"submodules/LegacyComponents"


]

path

=

submodules/LegacyComponents

url


=

../legacycomponents.git

[

submodule

"submodules/webp"


]

path

=

submodules/webp

url


=

../webp.git

万幸,全部指向相对路径的module实在都在 https://github.com/peter-iakovlev 这个账户下.

于是手动将全部相对路径的url都做相应修改后重新拉取submodule就可以正常拉取到全部需要用到的submodule了.

编译和须要的修改

如今已经可以正常使用Xcode打开项目了,固然现在另有太多的错误需要解决.

首先将Bundle ID修改为我自己需要的ID.

然后就是开发者账户的设置,将全部targets都设置为自己的开发者账户.

设置后仍旧有大量的错误,重要是Capabilities.

打开Capabilities后发现重要问题是App groups ID需要设置为自己开发者账户下的I!D,别的Telegram项目本身开启了Apple Pay以是需要设置Merchant ID. 设置好以后全部的错误应该都消散了,斗志昂扬的开始了编译…

结果提示错误:

Yasm not found

好吧,通过搜索发现这是一个小问题,直接通过brew安装这个包就好.

再次开始编译,这次碰到的问题是

Use of undeclared identifier 'APP_CONFIG_DATA'

,在项目issues列表中找到了相应的解决方案:

找到对应的一次 commit , 将

Telegram-iOS/BuildConfig.m

新增的内容解释后,将对应的3个数值更换为自己在 https://my.telegram.org/auth 申请到的AppID等数据.


在最新的5.7版本源码中已经只需要修改以下3项而不需要解释任何代码了



-


(


NSData


*


_Nullable


)


bundleData


{


return


nil


;


//_bundleData;


}


-


(


int32_t


)


apiId


{


return


123456


;


//_apiId;


}


-


(


NSString


*


_Nonnull


)


apiHash


{


return


@


"aaabbbcccdddeeefff"


;


//_apiHash;


}

更换后再次编译,应该就可以通过了.

一些留意的地方


  • Telegram-iOS/Config-Fork.xcconfig

    是我们需要编译的target, 我同时也将 Bundle ID 和 AppID等信息填写到了这个文件中.
  • 需要留意 Notification 等 Extension 的 BundleID 和 Telegram 的 BundleID 关系.

APNS

原来以为APNS是没什么盼望的,结果在Telegram的控制台居然看到了上传APNS证书的功能,在准确上传证书后APNS也可以正常工作了.

只是需要留意后台只担当上传pem格式证书.

取消群组和频道封禁

编辑

TelegramCore/Network/Api1.swift



parse_channel

函数,在

if Int(_1!) & Int(1 << 17) != 0 {_13 = reader.readInt32() }

后添加内容:



_1


=


_1


!


&


~


(


1


<<


9


)


&


~


(


1


<<


18


)


_9


=


nil


_12


=


nil


Telegram听说是一个加密级别非常高的即时通讯项目,从字面明白为电报,听说加密品级相当于美国的五角大楼

但是从官方网址下载的项目并不能直接编译天生,下面附上本人的经历,在mac截图弄在windows上编辑博客很费时,就简述

telegram官方网站:https://www.telegram.org/

源代码下载网页:https://www.telegram.org/apps

下载完IOS的代码后,mac主动解压,别急,先安装xcode静态通用模板,附上地点:https://github.com/kstenerud/iOS-Universal-Framework

使用mac终端,进入到

Real Framework文件夹下,实行sudo ./install.sh,回车,输入y,安装完成


如今可以打开telegram源代码,在这儿请设置bundle id,不然会提示invalid argument错误,编译成功后,但是还是不能运行,请到 https://my.telegram.org/


中注册自己的apiID和apihash,


在telegram项目搜索代码”

Please obtain your own apiId at
https://my.telegam.org ”

在TGTelegraph.mm文件中的NSAssert(false,”Please obtain your own apiId at
https://my.telegam.org”);之前,加上代码

self.apiId = @”xxxxx”;//自己的apiId

self.apiHash = @”x”;//自己的apiHash

在TGTelegramNetworking.m中的NSAssert(false,”Please obtain your own apiId at
https://my.telegam.org”);之前加上代码

apiEnvironment.apiId = xxxxx;//自己的apiId

apiId原来就是数字种类,前面的代码是官方这样写的,设置一次就好

至此,项目可以运行起来,真机或模仿器均可运行

但是本人实验修改bundle display name,也不能修改应用表现的名称,还请大神见教。别的product name等等都实验过.

——————————————————————————————————————————–

针对前面提到的无法变动bundle display name问题,附上解决方案

在info.plist文件中修改 CFBundleDevelopmentRegion属性为zh_CN,

在Telegraph->Supporting Files->Localization中自行添加zh.lproj文件夹,复制en.lproj文件夹下的两个文件

这两个文件接纳键值对编码,请对应翻译右边的英文为中文即可,本人英文不好,自行翻译,呵呵

实测真机调试,设置英文app全部表现文字均为英文包对应的文字,设置中文app全部表现文字均为中文包对应的文字

本文网址:

http://www.1cm8858.com/d/202086115043_1323_2269937668/home

Ten articles before and after

马可尼(1)〈无线电报之父〉永不消失的电波-电报telegram技巧分享

募资17亿美元Telegram代币GRAM公开销售7月开始-电报telegram技巧分享

telegram电报新手教学频道Sakimichan大师:神级画风大合集【1-电报telegram技巧分享

谁知道在抗战时期通讯员发电报是什么原理?百战经典-电报telegram技巧分享

数传电台的工作原理电报级电路-电报telegram技巧分享

看完了你还敢说你不懂西联汇款吗?日军截获电报-电报telegram技巧分享

应用文体:书信电报、电报挂号远去的词汇-电报telegram技巧分享

莫尔斯摩尔斯电码练习器发电报短波电台cw自动电键电子键无线电谍战片里绝密情报都是电报员收发的-电报telegram技巧分享

密码的近义词解释-电报telegram技巧分享

phpjavascript-电报telegram技巧分享