1. 程式人生 > >Telegram學習解析系列(一):認識一下Telegram的原始碼

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

前言:

        Telegram不知道有多少同行聽過這玩意,或者在看它的原始碼。我是出於工作原因才接觸到這東西,看的真是的......變方了!一個月估計剛剛找到門,還沒進去多深,把自己的心得和對原始碼的認識以及我工作中一些列的關於這個Telegram引發的問題全都寫出來,希望可以遇到同路中人,大家一起探討學習!有興趣的同行可以加文章最後面的telegramiOS開發學習群,一起學習討論Telegram問題,一起進步!

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

一:下載完了原始碼懵了沒?

        首先的說一下,我現在能完整執行的這份原始碼呢,是公司以前的同事執行起來的,聽說妹紙運行了一個星期,真的是...辛苦了,謝謝你了,最後我還是嘗試著在最新git原始碼的基礎上重新執行一份,增加一下讓它能完整執行的經驗,希望可以幫到大家,下面是自己整理完之後能夠完整執行的git連結,我是把它上傳到自己的git。當然你可以去它原來的git下載,自己嘗試著執行一下。下面連結這份我是經過了國際化處理的,讓它支援了中文!!

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

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

 *****************  群號可以直接貼上這裡:485718322