Mixin Messenger 源碼解讀 1 — — WCDB Swift


Mixin Messenger 早期采用 FMDB 后來切換至 WCDB 沿用至今,一直比較可靠穩定,這里分享一下使用心得和功能擴展。

關於 Mixin Messenger

Mixin Messenger 是一個開源的端對端加密聊天軟件,並且集成基於 Mixin Network 的多鏈錢包。

  • 支持 1v1 和 256 人群組端對端加密聊天
  • 支持完整的文字、圖片、貼紙、視頻、音頻、文件、聯系人消息類型,支持語音呼叫
  • 多鏈錢包目前支持 BTC、ETH、EOS、DASH、XRP、XEM、SC、DOGE、BCH、LTC、ZEC、ETC、ZEN 共計 13 條主鏈,超過 6.3 萬種代幣。基於 Mixin Network 的錢包還加強了隱私保護,使得轉賬交易不可被追蹤

官網下載:https://mixin.one/messenger
開源地址:https://github.com/MixinMessenger/ios-app

關於 WCDB Swift

WCDB Swift 是一個易用、高效、完整的移動數據庫框架,基於 SQLite 和 SQLCipher 開發。

  • 支持 Codable 協議,支持 ORM ,通過對象直接操作數據庫
  • 寫操作性能相比 FMDB 有明顯優化
  • 線程安全,可以安全地在任意線程進行數據庫操作
  • 數據庫字段升級很方便。由於數據庫模型與類定義綁定,使得字段的增加、刪除、修改都與類變量的定義保持一致,不需要開發者額外地管理字段的版本。
  • 支持 WINQ 語言集成查詢,官方宣稱只要是 SQL 支持的語句,都能使用語言集成查詢完成
  • 支持同步返回執行結果,避免陷入回調地獄(FMDB 使用 FMDatabaseQueue 時只能通過回調來返回數據,又不想用 DispatchSemaphore 來控制)
  • 支持全文搜索(暫時還沒有使用,不知道效果如何)
  • 支持原子操作,比如插入數據后立刻查詢(事務可以保證一段操作的原子性)

開源地址:https://github.com/Tencent/wcdb/

擴展新功能

fork 代碼開源地址:https://github.com/MixinNetwork/wcdb,注意使用 xcode10.2+swift4.2 分支代碼。

支持 SQL 語句

WINQ 語言集成查詢適用於簡單的增刪改查,但是對於非常復雜的 SQL 語句,用 WINQ 拼出來且不說代碼非常多 — — 可讀性和可移植性非常差,搞不懂官方為什么不支持一下。大體上讀了一下源碼可知 WINQ 也是拼 SQL 語句,由於庫作用域限制,只好 fork 一份改源碼:

// 帶參數查詢
database.prepareSelectSQL(User.Properties.Id, "SELECT id FROM users where id = ?", values: ["1"])
// 帶參數 LIKE 查詢
database.prepareSelectSQL(User.Properties.Id, "SELECT id FROM users where name like ?", values: ["%candy%"])

// 帶參數更新
let updateSQL = try database.prepareUpdateSQL(sql: "UPDATE conversations SET last_message_id = (select id from messages where conversation_id = ? order by created_at DESC limit 1) WHERE conversation_id = ?")
try updateSQL.execute(with: [conversationId, conversationId])

需要特別注意的是如果返回 Codable 數據,SELECT 字段的順序必須要和 CodingKeys 里的順序一致,否則數據會填充亂,用 WINQ 不會有這個問題。

支持備份功能

與微信、QQ、Telegram 不同,Mixin Messenger 是端對端加密服務器不存消息,使得消息備份功能必須需要依賴客戶端來完成,WCDB 沒有這個需求所以不支持,可以通過擴展 SQLite 直接支持:

try database.backup(withFile: path) { (remaining, pagecount) in
  // progress = Float(pagecount - remaining) / Float(pagecount)
}

參考

官方文檔:關於 WCDB Swift
Mixin是如何實現匿名交易的?


整體來說還是比較好用,關鍵是可靠,而且 Swift 支持的比較好,Codable 支持得也很贊,歡迎交流使用經驗,我的 Mixin ID:762532。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM