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; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM