zoukankan      html  css  js  c++  java
  • Telegram学习解析系列(一):认识一下Telegram的源码

    前言:

            Telegram不知道有多少同行听过这玩意,或者在看它的源码。我是出于工作原因才接触到这东西,看的真是的......变方了!一个月估计刚刚找到门,还没进去多深,把自己的心得和对源码的认识以及我工作中一些列的关于这个Telegram引发的问题全都写出来,希望可以遇到同路中人,大家一起探讨学习!有兴趣的同行可以加文章最后面的telegramiOS开发学习群,一起学习讨论Telegram问题,一起进步!

            先认识一些Telegram的源码以及基本框架的一个框架,遇到的问题我们会一点点的解决!

            这里是Telegram源码Git链接

    一:下载完了源码懵了没?

            首先的说一下,我现在能完整运行的这份源码呢,是公司以前的同事运行起来的,听说妹纸运行了一个星期,真的是...辛苦了,谢谢你了,最后我还是尝试着在最新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: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;
                        }
                    }
                }
            }
            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;
    }

     

  • 相关阅读:
    shell 模式匹配:case
    知识目录总结
    【运维--系统】nacos介绍和安装
    【运维--监控】zabbix自定义发现策略
    【转】在CentOS 8 / RHEL 8上配置主/从BIND DNS服务器
    【运维--安全相关】cerbot证书自动化续期
    【转】Docker 核心技术与实现原理
    【转】Kubernetes scheduler学习笔记
    [转]自建CDN防御DDoS
    【转】Dockerfile
  • 原文地址:https://www.cnblogs.com/zhangxiaoxu/p/6708790.html
Copyright © 2011-2022 走看看