Telegram學習解析系列(一):認識一下Telegram的源碼

前言:git

        Telegram不知道有多少同行聽過這玩意,或者在看它的源碼。我是出於工做緣由才接觸到這東西,看的真是的......變方了!一個月估計剛剛找到門,還沒進去多深,把本身的心得和對源碼的認識以及我工做中一些列的關於這個Telegram引起的問題全都寫出來,但願能夠遇到同路中人,你們一塊兒探討學習!有興趣的同行能夠加文章最後面的telegramiOS開發學習羣,一塊兒學習討論Telegram問題,一塊兒進步!github

        先認識一些Telegram的源碼以及基本框架的一個框架,遇到的問題咱們會一點點的解決!架構

        這裏是Telegram源碼Git連接框架

一:下載完了源碼懵了沒?dom

        首先的說一下,我如今能完整運行的這份源碼呢,是公司之前的同事運行起來的,據說妹紙運行了一個星期,真的是...辛苦了,謝謝你了,最後我仍是嘗試着在最新git源碼的基礎上從新運行一份,增長一下讓它能完整運行的經驗,但願能夠幫到你們,下面是本身整理完以後可以完整運行的git連接,我是把它上傳到本身的git。固然你能夠去它原來的git下載,本身嘗試着運行一下。下面連接這份我是通過了國際化處理的,讓它支持了中文!!學習

        編譯經過版本3.16  --  iOS端Telegram源碼連接    加密

        Telegram運行起來,可能沒那麼容易。 spa

 二:總體的一個框架認識code

        先看一下源碼總體的一個架構,下面的圖就是源碼的框架截圖:orm

        嗯,第一感受確定是很亂,其實你的感受沒錯,是真的很亂!這些東西要分析寫出來就真的太多了,說那個文件是什麼控制器,那個東西在哪裏,感受沒有太大的意義,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; }

        上面說的就這麼多吧,寫這篇的主要目的除了給出能完整運行的Telegram iOS端的源碼以外,還有說說這個支持中文的處理,最後仍是想把這個羣推薦出去,不論是Android仍是PC仍是iOS,只要是和Telegram相關的問題,都有人會幫你解決,你找到隊伍了!

 

 *****************  羣號能夠直接粘貼這裏:485718322  (已升級千人羣)

相關文章
相關標籤/搜索