Telegram-iOS 源碼分析:第三部分(Other Foundations)

版權(quán)聲明
本文內(nèi)容均為搬運水孩,目的只為更方便的學(xué)習(xí)Telegram編碼思維磨淌。

如需查閱原作者文章,附贈原文章機票

本章內(nèi)容將繼續(xù)介紹基礎(chǔ)模塊內(nèi)容

日志記錄(Logging)

該模塊TelegramCore提供了一個簡單的日志記錄實現(xiàn)龙巨。

public final class Logger {
    private let queue = Queue(name: "org.telegram.Telegram.log", qos: .utility)
    // `false` in AppStore build
    public var logToFile: Bool
    // `false` in AppStore build
    public var logToConsole: Bool
    // `true` in AppStore build
    public var redactSensitiveData: Bool

    public static var shared: Logger

    public func log(_ tag: String, _ what: @autoclosure () -> String)
}

// for other modules
Logger.shared.log("Keychain", "couldn't get \(key) — not current")

如果開關(guān)打開,它支持在控制臺打印和寫入文件熊响。用于文件寫入的queue在非主線程進行旨别。redactSensitiveData是另一個開關(guān)決定,是否在日志消息中包括敏感數(shù)據(jù)(例如具體的消息內(nèi)容)汗茄。

if Logger.shared.redactSensitiveData {
    messageText = "[[redacted]]"
} else {
    messageText = message.text
}

在公開發(fā)布的版本中秸弛,仍然可以通過上面介紹的應(yīng)用內(nèi)調(diào)試控制器來更改設(shè)置。

對于不依賴TelegramCore的模塊洪碳,項目將通過Network.swift當中設(shè)置橋函數(shù)registeredLoggingFunctions递览,重定向其他模塊(MtProtoKitPostbox瞳腌,和TelegramApi等)的記錄/打印配置绞铃。

這不是一個甚至都不支持日志記錄級別的理想框架。還有許多模塊根本不進行日志記錄嫂侍,或僅通過Print/NSLog進行日志記錄儿捧。在我看來,在未來或許會進一步清理挑宠。

崩潰報告

Telegram不使用第三方SDK以此來防止用戶數(shù)據(jù)泄漏菲盾,這是合理的。令我感到驚訝的是痹栖,該項目沒有任何內(nèi)置的崩潰報告模塊亿汞,甚至沒有本地的崩潰報告模塊。在查看提交歷史之后揪阿,它確實集成了Hockey SDK疗我,然后于今年1月通過提交bdc0bb2將其刪除咆畏。工程師大概可以依賴AppStore的崩潰報告來檢查穩(wěn)定性問題。

Hockey SDK已被Microsoft淘汰吴裤,轉(zhuǎn)而支持App Center旧找。Telegram-iOS使用App Center API來檢查更新。沒有與SDK集成麦牺。

磁盤存儲

為了支持main app钮蛛、watch appintents app extension之間的數(shù)據(jù)共享剖膳,該項目將大多數(shù)數(shù)據(jù)存儲在名為telegram-data組容器文件夾中魏颓。一些舊組件仍在使用Documents文件夾。以下是telegram-data典型的布局:

telegram-data/
|-- .tempkey  // the key for sqlcipher
|-- account-0123456789/ // data for account 0123456789
|   |-- network-stats/ // for `MTNetworkUsageManagerImpl`
|   |-- notificationsKey 
|   `-- postbox/ 
|       |-- db/
|       `-- media/ // media cache
|           |-- cache/
|           |-- short-cache/
|-- accounts-metadata/ // for `AccountManager`
|   |-- atomic-state/
|   |-- db/
|   |-- guard_db/
|   |-- media/
|   `-- spotlight/
|-- accounts-shared-data/
|-- lockState.json
|-- logs/  // log files
|-- notificationsPresentationData.json
|-- temp/
|   `-- app/
|-- widget-data/
`-- widgetPresentationData.json

除了直接讀寫文件外吱晒,該項目還主要SQLite用于結(jié)構(gòu)化數(shù)據(jù)甸饱。啟用了兩個SQLite擴展:SQLCipher用于完全數(shù)據(jù)庫加密;FTS5用于全文本搜索仑濒。這種方法在其他流行的即時通訊中也很流行叹话,例如WeChatSignalApp

LMDB是基于BTree的事務(wù)鍵值存儲墩瞳,它提供了一些Objective-C組件:例如TGEmbedCoubPlayerViewcoub.com的嵌入式播放器)驼壶,TGMediaEditingContext它負責(zé)在發(fā)送媒體消息時編輯照片和視頻。

網(wǎng)絡(luò)傳輸

消息傳遞和VoIP Call是需要網(wǎng)絡(luò)傳輸?shù)膬蓚€主要方案喉酌∪劝迹可靠的連接性和實時更新是即時通訊的重要特征,這是一個令人著迷的挑戰(zhàn)泪电,因為全球網(wǎng)絡(luò)環(huán)境相當復(fù)雜碌嘀。為此發(fā)明了一些工程技巧,并在即時通訊中廣泛應(yīng)用歪架,例如流量混淆,混合端點發(fā)現(xiàn)霹陡,域前沿等和蚪。

MTProtoTelegram的核心協(xié)議,旨在支持多種傳輸協(xié)議烹棉。當前版本的Telegram-iOS僅支持TCP傳輸攒霹。HTTP傳輸已于2018年刪除。VoIP模塊libtgvoip支持UDP和TCP傳輸浆洗。

Telegram-iOS還利用來自PushKitVoIP Notifications來通過Apple的網(wǎng)絡(luò)接收數(shù)據(jù)催束。這是另一個廣泛使用的技巧,使應(yīng)用程序可以將數(shù)據(jù)封裝在通知有效負載中并在后臺處理數(shù)據(jù)伏社,而無需用戶進行交互抠刺。普通的APNS無法做到相同的行為塔淤。這對于某些核心功能至關(guān)重要,例如更新未讀計數(shù)速妖,在應(yīng)用程序無法連接到后端時檢索新端點高蜂,更新活動位置等。

由于任何濫用行為都可能導(dǎo)致嚴重的電池消耗問題罕容,因此自iOS SDK 13以來备恤,Apple在收到VoIP通知后開始要求應(yīng)用程序必須調(diào)用CallKit。但是Telegram-iOS似乎可以從新規(guī)則中幸免锦秒,因為它獲得了Apple的特別授權(quán):com.apple.developer.pushkit.unrestricted-voip露泊。在SignalApp中也可以找到相同的未記錄權(quán)利。

UI框架

除了使用AsyncDisplayKit作為其核心UI呈現(xiàn)框架之外旅择,Telegram-iOS進一步開發(fā)并重新實現(xiàn)了常見的UIKit控制器和視圖惭笑。大多數(shù)UIKit的組件可以找到項目內(nèi)的替代組件:NavigationControllerTabBarController砌左,AlertController脖咐,ActionSheetControllerNavigationBar汇歹,ItemListController(更換的UITableViewController的)等的方法是相當合理的屁擅。

題外話。有趣的是产弹,大多數(shù)iOS工程師最終都會在UIKit上學(xué)到一些技巧派歌。不知何故,重新實現(xiàn)UINavigationController之類的組件并不是一件容易的事痰哨,因為要破解原始組件胶果。我最喜歡的細節(jié)之一是UINavigationController如何設(shè)法推送和彈出僅橫向模式的控制器

關(guān)于UI屬性動畫,這POP是Objective-C中傳統(tǒng)UI組件的一種斤斧,而swift模塊大多在CADisplayLinkCoreAnimation上使用其自己的動畫器實現(xiàn)早抠。

應(yīng)用程序內(nèi)置了兩個Lottie庫rlottielottie-ios,以支持After Effects動畫撬讽。rlottie主要是為動畫貼紙tgs格式蕊连。Lottie-ios用于從Bundle資源加載動畫文件。似乎實際上沒有必要為同一件事使用兩個庫游昼,lottie-ios可以用代替rlottie甘苍。

單元測試

項目中基本上沒有單元測試。

應(yīng)用內(nèi)調(diào)試

輕按10次設(shè)置可能會顯示調(diào)試控制器烘豌,您可以在其中調(diào)整日志設(shè)置载庭,收集日志,嘗試實驗性UI設(shè)置等。

part3-debug.jpeg

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末囚聚,一起剝皮案震驚了整個濱河市靖榕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌靡挥,老刑警劉巖序矩,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跋破,居然都是意外死亡簸淀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門毒返,熙熙樓的掌柜王于貴愁眉苦臉地迎上來租幕,“玉大人,你說我怎么就攤上這事拧簸【⑿鳎” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵盆赤,是天一觀的道長贾富。 經(jīng)常有香客問我,道長牺六,這世上最難降的妖魔是什么颤枪? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮淑际,結(jié)果婚禮上畏纲,老公的妹妹穿的比我還像新娘。我一直安慰自己春缕,他們只是感情好盗胀,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锄贼,像睡著了一般票灰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宅荤,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天米间,我揣著相機與錄音,去河邊找鬼膘侮。 笑死,一個胖子當著我的面吹牛的榛,可吹牛的內(nèi)容都是我干的琼了。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雕薪!你這毒婦竟也來了昧诱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤所袁,失蹤者是張志新(化名)和其女友劉穎盏档,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燥爷,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蜈亩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了前翎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稚配。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖港华,靈堂內(nèi)的尸體忽然破棺而出道川,到底是詐尸還是另有隱情,我是刑警寧澤立宜,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布冒萄,位于F島的核電站,受9級特大地震影響橙数,放射性物質(zhì)發(fā)生泄漏尊流。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一商模、第九天 我趴在偏房一處隱蔽的房頂上張望奠旺。 院中可真熱鬧,春花似錦施流、人聲如沸响疚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忿晕。三九已至,卻和暖如春银受,著一層夾襖步出監(jiān)牢的瞬間践盼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工宾巍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咕幻,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓顶霞,卻偏偏與公主長得像肄程,于是被迫代替她去往敵國和親锣吼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容