Mixin Messenger 源碼解讀 1 — — WCDB Swift

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

關於 Mixin Messenger

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

  • 支持 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-appgithub

關於 WCDB Swift

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

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

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

擴展新功能

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

支持 SQL 語句

WINQ 語言集成查詢適用於簡單的增刪改查,可是對於很是複雜的 SQL 語句,用 WINQ 拼出來且不說代碼很是多 — — 可讀性和可移植性很是差,搞不懂官方爲何不支持一下。大致上讀了一下源碼可知 WINQ 也是拼 SQL 語句,因爲庫做用域限制,只好 fork 一份改源碼:xcode

// 帶參數查詢
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。

相關文章
相關標籤/搜索