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。

相关文章
相关标签/搜索