Mixin Messenger 早期採用 FMDB 後來切換至 WCDB 沿用至今,一直比較可靠穩定,這裡分享一下使用心得和功能擴展。 ...
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 一份改源碼:
- 參考 https://github.com/MixinNetwork/wcdb/commit/33869a3195b806cbac4bbe667b4b73d003917139 修改記錄即可支持 SQL ,新增了 SelectSQL 和 UpdateSQL 等對象
- 使用 SQL 語句查詢和更新:
// 帶參數查詢
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。