Mixin Messenger 早期采用 FMDB 后来切换至 WCDB 沿用至今,一直比较可靠稳定,这里分享一下使用心得和功能扩展。
Mixin Messenger 是一个开源的端对端加密聊天软件,并且集成基于 Mixin Network 的多链钱包。
官网下载:https://mixin.one/messenger
开源地址:https://github.com/MixinMessenger/ios-app
WCDB Swift 是一个易用、高效、完整的移动数据库框架,基于 SQLite 和 SQLCipher 开发。
开源地址:https://github.com/Tencent/wcdb/
fork 代码开源地址:https://github.com/MixinNetwork/wcdb,注意使用 xcode10.2+swift4.2 分支代码。
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 直接支持:
参考 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。