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;}}}}elselocalizationBundle = [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?
總結
以上是生活随笔為你收集整理的Telegram学习解析系列(一):认识一下Telegram的源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Acwing 861-二分图的最大匹配
- 下一篇: 移动电源是什么?有哪些类型?