欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Mixin Messenger 源码解读 1 — — WCDB Swift

程序员文章站 2022-12-05 14:55:22
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://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 一份改源码:

// 带参数查询
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。