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 一份改源码:

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

Mixin Messenger 源码解读 1 — — WCDB Swift的更多相关文章

  1. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  2. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager

    做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一 ...

  3. AfNetworking 3.0源码解读

    做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一 ...

  4. Alamofire源码解读系列(一)之概述和使用

    尽管Alamofire的github文档已经做了很详细的说明,我还是想重新梳理一遍它的各种用法,以及这些方法的一些设计思想 前言 因为之前写过一个AFNetworking的源码解读,所以就已经比较了解 ...

  5. Alamofire源码解读系列(二)之错误处理(AFError)

    本篇主要讲解Alamofire中错误的处理机制 前言 在开发中,往往最容易被忽略的内容就是对错误的处理.有经验的开发者,能够对自己写的每行代码负责,而且非常清楚自己写的代码在什么时候会出现异常,这样就 ...

  6. Alamofire源码解读系列(四)之参数编码(ParameterEncoding)

    本篇讲解参数编码的内容 前言 我们在开发中发的每一个请求都是通过URLRequest来进行封装的,可以通过一个URL生成URLRequest.那么如果我有一个参数字典,这个参数字典又是如何从客户端传递 ...

  7. Alamofire源码解读系列(三)之通知处理(Notification)

    本篇讲解swift中通知的用法 前言 通知作为传递事件和数据的载体,在使用中是不受限制的.由于忘记移除某个通知的监听,会造成很多潜在的问题,这些问题在测试中是很难被发现的.但这不是我们这篇文章探讨的主 ...

  8. Alamofire源码解读系列(五)之结果封装(Result)

    本篇讲解Result的封装 前言 有时候,我们会根据现实中的事物来对程序中的某个业务关系进行抽象,这句话很难理解.在Alamofire中,使用Response来描述请求后的结果.我们都知道Alamof ...

  9. Alamofire源码解读系列(六)之Task代理(TaskDelegate)

    本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...

随机推荐

  1. 入职小白随笔之Android四大组件——内容提供器详解(Content Provider)

    Content Provider 内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间 实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的 ...

  2. PHP 利用PHPExcel到处数据到Excel;还有导出数据乱码的解决方案。

    直接贴代码吧 PHP版本5.6.38 mysql版本5.0 //连接数据库 $mysql_server_name = "*.*.*.*"; $mysql_username=&quo ...

  3. C++ 进阶笔记之一

    优化相关 使用灵活的.动态分配的数据,不要使用固定大小多数组: 优先使用线性算法或者尽可能快的算法: push_back 散列表查询:O(1) set/map lower_bound/upper_bo ...

  4. OS X 下 OpenGL 4.x 环境配置

    配置: OS X 10.10 + CMake 3.2.2 + GLFW 3.1.1 + OpenGL 4.1 + Xcode 6.0 本文主要介绍如何在 OS X 系统下进行环境配置,使得 Xcode ...

  5. 《HTTPS权威指南》读书笔记——PKI

    互联网公钥基础设施 基于可信的第三方机构(CA,certification authority)实现不同成员在不见面的情况下进行安全通信 订阅人 需要证书来提供安全服务的团体 登记机构(RA) 完成证 ...

  6. selenium原理应用 - 利用requests模拟selenium驱动浏览器

    前言 selenium是一个web自动化测试的开源框架,它支持多语言:python/java/c#… 前面也有一篇文章说明了,selenium+浏览器的环境搭建. selenium支持多语言,是因为s ...

  7. web安全技术--XSS和CSRF

    Xss一般是脚本代码,主要是JS的,但是也有AS和VBS的. 主要分为反射型,存储型,DOM型三个大类. 一般来讲在手工测试的时候先要考虑的地方就是哪里有输入那里有输出. 然后是进行敏感字符测试,通常 ...

  8. react后台项目开发(一)

    1. 项目开发准备 描述项目 技术选型 api 接口(4部分:3请求{url,请求方式,请求参数格式}, 1响应数据格式)/ 接口文档/ 测试接口 2. 启动项目开发 使用react脚手架创建项目 开 ...

  9. C++入门到理解阶段二基础篇(8)——C++指针

    1.什么是指针? 为了更加清楚的了解什么是指针?我们首先看下变量和内存的关系,当我们定义了int a=10之后.相当于在内存之中找了块4个字节大小的空间,并且存储10,要想操作这块空间,就通过a这个变 ...

  10. 【朝花夕拾】Android自定义View篇之(四)自定义View的三种实现方式及自定义属性使用介绍

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10979161.html],谢谢! 尽管Android系统提供了不少控件,但是有很多酷炫效果仍然 ...