Telegram学习解析系列(一):认识一下Telegram的源码
前言:
Telegram不知道有多少同行听过这玩意,或者在看它的源码。我是出于工作原因才接触到这东西,看的真是的......变方了!一个月估计刚刚找到门,还没进去多深,把自己的心得和对源码的认识以及我工作中一些列的关于这个Telegram引发的问题全都写出来,希望可以遇到同路中人,大家一起探讨学习!有兴趣的同行可以加文章最后面的telegramiOS开发学习群,一起学习讨论Telegram问题,一起进步!
先认识一些Telegram的源码以及基本框架的一个框架,遇到的问题我们会一点点的解决!
一:下载完了源码懵了没?
首先的说一下,我现在能完整运行的这份源码呢,是公司以前的同事运行起来的,听说妹纸运行了一个星期,真的是...辛苦了,谢谢你了,最后我还是尝试着在最新git源码的基础上重新运行一份,增加一下让它能完整运行的经验,希望可以帮到大家,下面是自己整理完之后能够完整运行的git链接,我是把它上传到自己的git。当然你可以去它原来的git下载,自己尝试着运行一下。下面链接这份我是经过了国际化处理的,让它支持了中文!!
编译通过版本3.16 -- iOS端Telegram源码链接
Telegram运行起来,可能没那么容易。
二:整体的一个框架认识
先看一下源码整体的一个架构,下面的图就是源码的框架截图:
嗯,第一感觉肯定是很乱,其实你的感觉没错,是真的很乱!这些东西要分析写出来就真的太多了,说那个文件是什么控制器,那个东西在哪里,感觉没有太大的意义,z这里简单的说一下一个大概,可能刚看的时候会与一点用吧,最下面有群,有问题加进来一起讨论吧。有两个地方提一下,看下面的图,单从最简单的出发的话,下面两个地方你关注的可能会多一点:
1:控制器
2:消息发送接收
这里面主要你要了解项目宗最基本的开始的话,几乎都在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上的源码里面是添加了中文支持的文件的。
下面是源码,注意里面哪里的判断,要是不理解或者是有问题还是那句,加我们下面的群,想把这个群做好一点,找一些大家都在研究同一个东西的同行,交流可以更快的了解这个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:];
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;
}
}
}
}
else
localizationBundle = [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学习解析系列(一):认识一下Telegram的源码的更多相关文章
- Telegram学习解析系列(二):这我怎么给后台传输数据?
写在前面: 在iOS开发的过程中,有很多时候我们都在和数据打交道,最基本的就是数据的下载和上传了,估计很多很多的小伙伴都在用AFNetworking与后台数据打交道,可有没有想过,哪天AFNetwor ...
- Telegram学习解析系列(三) : Build Telegram报错分析总结
正好通过这次 Telegram 的运行,很想把常见的项目运行的错误好好的总结一下,在前面的博客中,又星星散散的总结过错误和一些警告的消除方法,这次把错误处理一下,还有Telegram项目中有999+的 ...
- Java并发包源码学习系列:JDK1.8的ConcurrentHashMap源码解析
目录 为什么要使用ConcurrentHashMap? ConcurrentHashMap的结构特点 Java8之前 Java8之后 基本常量 重要成员变量 构造方法 tableSizeFor put ...
- Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
概要 前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对Linked ...
- Java 集合系列07之 Stack详细介绍(源码解析)和使用示例
概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. ...
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...
- Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...
- 【转】Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...
- 【转】 Java 集合系列07之 Stack详细介绍(源码解析)和使用示例
概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. ...
随机推荐
- (解决方法)Android studio 运行时报错Do you want to uninstall the existing application?的解决方法
在Android studio中,有时运行会报错: WARNING: Uninstalling will remove the application data!Do you want to unin ...
- 10大支持移动“触摸操作”的JavaScript框架
摘要:移动开发行业的发展速度让人目不暇接,也在此大势之下,推出移动网站App成为开发者必经之路,如何让触屏设备 更易使用?如何让网站对触摸手势做出反应并使触摸更友好?所有这一切,皆因JavaScrip ...
- javascript的闭包与一次重构的感受
有没有这么一个场景,你的一个动作需要在所有异步方法执行完毕后,再进行操作?然而你对异步方法何时执行完毕感到困扰,只能在每个方法中写回调,在回调中重复劳动? 偶然的,想起了之前经理讲过的闭包的概念,偶然 ...
- 【C#】组件分享:FormDragger-窗体拖拽器
适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随 ...
- MongoDB基础教程系列--第三篇 MongoDB基本操作(二)
1.集合操作 1.1.创建集合 MongoDB 用 db.createCollection(name, options) 方法创建集合. 格式 db.createCollection(name, op ...
- [SinGuLaRiTy] 2017-03-30 综合性测试
[SinGuLaRiTy-1014] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有的题目:Time Limit:1s | Me ...
- 【Egret】使用Egret开发的HTML5项目,使用本地电脑作为服务器进行移动端调试流程
流程: 1.先开启本机IIS服务器 具体开启流程如下:http://www.jb51.net/article/29787.htm 2.添加服务器MIME类型, 按照以下两个教程把所有的MIME类型都添 ...
- 初步了解关于js跨域问题
js跨域问题是指在js在不同的域中进行数据传输或者数据通信,比如通过ajax向不同的域请求数据(说到ajax,不可避免的就会遇到两个问题:一是ajax是如何传递数据的?二是ajax是如何实现跨域的?) ...
- org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6709758.html Android Studio导入项目报错: org.gradle.api.inter ...
- Java NIO之通道
一.前言 前面学习了缓冲区的相关知识点,接下来学习通道. 二.通道 2.1 层次结构图 对于通道的类层次结构如下图所示. 其中,Channel是所有类的父类,其定义了通道的基本操作.从 Channel ...