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