版權(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递览,重定向其他模塊(MtProtoKit,Postbox瞳腌,和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 app
、intents 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用于全文本搜索仑濒。這種方法在其他流行的即時通訊中也很流行叹话,例如WeChat和SignalApp。
LMDB是基于BTree的事務(wù)鍵值存儲墩瞳,它提供了一些Objective-C組件:例如TGEmbedCoubPlayerView(coub.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)霹陡,域前沿等和蚪。
MTProto是Telegram
的核心協(xié)議,旨在支持多種傳輸協(xié)議烹棉。當前版本的Telegram-iOS僅支持TCP傳輸攒霹。HTTP傳輸已于2018年刪除。VoIP模塊libtgvoip支持UDP和TCP傳輸浆洗。
Telegram-iOS還利用來自PushKit
的VoIP 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)的替代組件:NavigationController
,TabBarController
砌左,AlertController
脖咐,ActionSheetController
,NavigationBar
汇歹,ItemListController
(更換的UITableViewController的)等的方法是相當合理的屁擅。
題外話。有趣的是产弹,大多數(shù)iOS工程師最終都會在UIKit上學(xué)到一些技巧派歌。不知何故,重新實現(xiàn)UINavigationController之類的組件并不是一件容易的事痰哨,因為要破解原始組件胶果。我最喜歡的細節(jié)之一是UINavigationController如何設(shè)法推送和彈出僅橫向模式的控制器
關(guān)于UI屬性動畫,這POP是Objective-C中傳統(tǒng)UI組件的一種斤斧,而swift模塊大多在CADisplayLink或CoreAnimation上使用其自己的動畫器實現(xiàn)早抠。
應(yīng)用程序內(nèi)置了兩個Lottie庫rlottie和lottie-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è)置等。