Telegram学习解析系列(一):认识一下Telegram的源码
前言:
Telegram不知道有多少同行听过这玩意,或者在看它的源码。我是出于工作原因才接触到这东西,看的真是的......变方了!一个月估计刚刚找到门,还没进去多深,把自己的心得和对源码的认识以及我工作中一些列的关于这个Telegram引发的问题全都写出来,希望可以遇到同路中人,大家一起探讨学习!有兴趣的同行可以加文章最后面的telegramiOS开发学习群,一起学习讨论Telegram问题,一起进步!
先认识一些Telegram的源码以及基本框架的一个框架,遇到的问题我们会一点点的解决!
一:下载完了源码懵了没?
首先的说一下,我现在能完整运行的这份源码呢,是公司以前的同事运行起来的,听说妹纸运行了一个星期,真的是...辛苦了,谢谢你了,最后我还是尝试着在最新git源码的基础上重新运行一份,增加一下让它能完整运行的经验,希望可以帮到大家,下面是自己整理完之后能够完整运行的git链接,我是把它上传到自己的git。当然你可以去它原来的git下载,自己尝试着运行一下。下面链接这份我是经过了国际化处理的,让它支持了中文!!
Telegram运行起来,可能没那么容易。
二:整体的一个框架认识
先看一下源码整体的一个架构,下面的图就是源码的框架截图:
![](https://ask.qcloudimg.com/raw/rsau8gph31.png?imageView2//0/w/1620)
嗯,第一感觉肯定是很乱,其实你的感觉没错,是真的很乱!这些东西要分析写出来就真的太多了,说那个文件是什么控制器,那个东西在哪里,感觉没有太大的意义,z这里简单的说一下一个大概,可能刚看的时候会与一点用吧,最下面有群,有问题加进来一起讨论吧。有两个地方提一下,看下面的图,单从最简单的出发的话,下面两个地方你关注的可能会多一点:
1:控制器
2:消息发送接收
![](https://ask.qcloudimg.com/raw/ct057esz7.png?imageView2//0/w/1620)
这里面主要你要了解项目宗最基本的开始的话,几乎都在Telegraph文件里面,我就大概的总结一下这个文件里面的子文件夹都存放的什么,比如说主要的控制器在哪,图片在哪等等的,从最基本的了解一下他的主要的文件都在哪里。剩下的比如说发送的方法在哪的,这个就真的多的没办法说了,有问题还是在群里面交流!
--------------------------------------------------- 我是分割线 ------------------------------------------------------------------------
AppResources 文件
这个文件放的全部都是整个应用的图片,自己的意见,不喜欢这样直接把项目图片放进去,最好加入Images.xcassets文件中。
Legacy 文件
文件主要是项目用到的一些属性类,比如消息体的封装,自己用到的颜色分装,文件的属性等等这些类。
submodules 文件
这个文件里面的东西真的不太懂。
App Delegate 文件
这个我就不多加解释了,估计也都明白。
User Interface 文件
这里面有分了Legacy和Controllers两个文件,这个文件UI就就几乎都在这里了,登录和主要的控制器都在这两个文件里面。
Elements 文件
这个文件主要都是一些自定义的基础控件
Core 文件
看字面的意思,这个也是主要的,里面涉及到消息的发送、接收、回调、请求等等都在这里。还有一点需要特别说明的:你要找消息的发送接收的方法的话藏得还是挺深的 在下面的ActionStage文件的Actors里面有个Messages文件,这里就是具体消息的发送接收,你可以去看看。
Bridge 文件
这个文件里面的东西,我看了看感觉就像我们平时写的Model,具体的需要你去看源码学习了。
--------------------------------------------------- 我是分割线 ------------------------------------------------------------------------
上面说的这的到这里,下面说说怎么对它进行的中文处理,由于公司的项目是在这个的基础上做的,以后很长时间估计自己全都会和这个项目打交道,所以有什么问题大家积极交流,这个我真的也只是刚入门,还在看代码,要是能有大神进群聊聊那就真的是开心了。。
三:让它支持中文
直接进入主题了,先说说这个文件 #import "TGCommon.h".这个TGCommon里面定义的都是一些常用的方法,比如比较字符串是否相等、获取系统的版本号、字符串的MD5加密等等的东西,当然我们要说的这个国际化的 TGLocalized 也是在这里定义的,以前的时候我们的国际化的可能都是通过NSLocalizedString来获取Value值,设置给相应的控件的。这里的这个 TGLocalized 说白了就是对它的一个自定义封装。先看看在我传到Git上的源码里面是添加了中文支持的文件的。
![](https://ask.qcloudimg.com/raw/w3f8cdfngo.png?imageView2//0/w/1620)
下面是源码,注意里面哪里的判断,要是不理解或者是有问题还是那句,加我们下面的群,想把这个群做好一点,找一些大家都在研究同一个东西的同行,交流可以更快的了解这个Telegram。
#pragma mark -- 自定义本地化TGLocalized
NSString * TGLocalized(NSString *s){static NSString * untranslatedString = nil;static dispatch_once_t onceToken1;dispatch_once(&onceToken1, ^{untranslatedString = [[NSString alloc] initWithFormat:@"UNTRANSLATED_%x", (int)arc4random()];if ([[NSFileManager defaultManager] fileExistsAtPath:customLocalizationBundlePath()])customLocalizationBundle = [NSBundle bundleWithPath:customLocalizationBundlePath()];});if (customLocalizationBundle != nil){NSString *string = [customLocalizationBundle localizedStringForKey:s value:untranslatedString table:nil];if (string != nil && ![string isEqualToString:untranslatedString])return string;}static NSBundle * localizationBundle = nil;static NSBundle * fallbackBundle = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{fallbackBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]];NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];if ([language isEqualToString:@"gl"] || [language isEqualToString:@"eu"]) {language = @"es";}if (![[[NSBundle mainBundle] localizations] containsObject:language]){localizationBundle = fallbackBundle;if ([language rangeOfString:@"-"].location != NSNotFound){//****** 通过下面的判断,让它支持中文 ************///*******************************************/NSString *languageWithoutRegion;if ([language isEqualToString:@"zh-Hans-CN"]) {languageWithoutRegion = @"zh-Hans";}else{languageWithoutRegion = [language substringToIndex:[language rangeOfString:@"-"].location];}for (NSString * localization in [[NSBundle mainBundle] localizations]){if ([languageWithoutRegion isEqualToString:localization]){NSBundle *candidateBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:localization ofType:@"lproj"]];if (candidateBundle != nil)localizationBundle = candidateBundle;break;}}}}elselocalizationBundle = [NSBundle mainBundle];});NSString *string = [localizationBundle localizedStringForKey:s value:untranslatedString table:nil];if (string != nil && ![string isEqualToString:untranslatedString])return string;if (localizationBundle != fallbackBundle){NSString *string = [fallbackBundle localizedStringForKey:s value:untranslatedString table:nil];if (string != nil && ![string isEqualToString:untranslatedString])return string;}return s;
}
上面说的就这么多吧,写这篇的主要目的除了给出能完整运行的Telegram iOS端的源码之外,还有说说这个支持中文的处理,最后还是想把这个群推荐出去,不管是Android还是PC还是iOS,只要是和Telegram相关的问题,都有人会帮你解决,你找到队伍了!
***************** 群号可以直接粘贴这里:485718322
Telegram学习解析系列(一):认识一下Telegram的源码相关推荐
- Crackme006 - 全新160个CrackMe深度解析系列(图文+视频+注册机源码)
原文链接 CrackMe006 | 难度适中适合练手 |160个CrackMe深度解析(图文+视频+注册机源码) crackme006,依然是delphi的,而且没壳子,条线比较清晰,算法也不难,非常 ...
- MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法
说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都在它的源码 ...
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
转载自 Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与 ...
- linux的进程/线程/协程系列3:查看linux内核源码——vim+ctags/find+grep
linux的进程/线程/协程系列3:查看linux内核源码--vim+ctags/find+grep 前言 摘要: 1. 下载linux内核源码 2. 打标签方法:vim+ctags 2.1 安装vi ...
- vscode中安装webpack_leaflet-webpack 入门开发系列一初探篇(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载 webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址w ...
- 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇
https://www.cnblogs.com/harlanc/p/9693983.html 目录 OpenSL ES & AudioTrack 源码分析 创建播放器音频输出对象 配置并创建音 ...
- 【Active Learning - 00】主动学习重要资源总结、分享(提供源码的论文、一些AL相关的研究者)
主动学习系列博文: [Active Learning - 00]主动学习重要资源总结.分享(提供源码的论文.一些AL相关的研究者):https://blog.csdn.net/Houchaoqun_X ...
- 图文深度解析Linux内存碎片整理实现机制以及源码
图文深度解析Linux内存碎片整理实现机制以及源码. 物理内存是以页为单位进行管理的,每个内存页大小默认是4K(大页除外).申请物理内存时,一般都是按顺序分配的,但释放内存的行为是随机的.随着系统运行 ...
- php手游服务端开发教程,【手游服务端】梦想海贼王 卡牌系列一键端服务端游戏源码+教程...
[手游服务端]梦想海贼王 卡牌系列一键端服务端游戏源码+教程 游戏介绍: <梦想海贼王>是一款卡牌类手游,游戏以全球第一超人气动漫<海贼王>为题材,用Q版风格配合新奇多样的玩法 ...
最新文章
- 教育部公布:清华北大等12校首批开设“未来技术学院”,它们都设置了哪些专业?...
- 电子计算机微机调试员,电子计算机(微机)装配调试员国家职业标准
- python源码学习_【Python学习】Python源码阅读(一)
- Spinner的使用方法
- Serverless 落地挑战与蚂蚁金服实践
- mysql md5解密_Web渗透测试——Mysql数据库手工注入
- VUE+axios+php实现图片上传
- Windows动态桌面原理
- 机房收费系统——可行性分析报告
- 家庭wifi部署建议
- WIN10 U盘打开无权限问题
- 计算机二级考试python考试大纲
- 东方博易OJ——1002 - 【入门】编程求解1+2+3+...+n
- 【stm32单片机基础】按键状态机实现长按和短按
- 托格机器人_爱,死亡和机器人人第一季
- 程序设计基础—什么是逻辑与、或、非关系?
- VPS融合怪测评脚本(主体已完善,历史遗留问题解决时间未知)(VPS fusion monster evaluation script)
- 2022.10.1 NYIST 国庆欢乐进行曲题解
- 开源项目之杀毒软件 clamwin
- 文艺中年高晓松成“岛主” 上万册图书免费看