Mixin Messenger 早期採用 FMDB 後來切換至 WCDB 沿用至今,一直比較可靠穩定,這裏分享一下使用心得和功能擴展。ios
Mixin Messenger 是一個開源的端對端加密聊天軟件,而且集成基於 Mixin Network 的多鏈錢包。git
官網下載:https://mixin.one/messenger 開源地址:https://github.com/MixinMessenger/ios-appgithub
WCDB Swift 是一個易用、高效、完整的移動數據庫框架,基於 SQLite 和 SQLCipher 開發。sql
開源地址:https://github.com/Tencent/wcdb/數據庫
fork 代碼開源地址:https://github.com/MixinNetwork/wcdb,注意使用 xcode10.2+swift4.2 分支代碼。swift
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 直接支持:服務器
參考 https://github.com/MixinNetwork/wcdb/commit/83416a270116fe97fc5f8873d0ad5686a24964db 修改記錄便可支持備份功能,還支持進度回調微信
使用備份功能:
try database.backup(withFile: path) { (remaining, pagecount) in // progress = Float(pagecount - remaining) / Float(pagecount) }
官方文檔:關於 WCDB Swift Mixin是如何實現匿名交易的?
總體來講仍是比較好用,關鍵是可靠,並且 Swift 支持的比較好,Codable 支持得也很贊,歡迎交流使用經驗,個人 Mixin ID:762532。