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