iOS 面试 | 如果要存储用户的账号密码,你会选择什么方案?
内容提要
KeyChain服务是一种可靠的数据持久化方案,可以保存用户的账号密码,并通过iCloud同步。其他常见的持久化方案包括NSUserDefault、MMKV、NSKeyedArchiver、Sqlite、CoreData、FMDB、Realm和WCDB。每种方案都有不同的特点和适用场景。
延伸解读
KeyChain 的独特优势
KeyChain 不仅适合存储账号密码等敏感数据,还具备两个关键特性:删除 App 后数据依然保留,且能通过 iCloud 同步。这意味着用户重新安装 App 时,仍可读取之前的账号信息,提升体验。但需注意,KeyChain 的访问控制需妥善配置,避免数据泄露。
Key-Value 存储的适用场景
NSUserDefault 适合存储不敏感的配置和偏好,但写入非实时,有 runloop 延迟。MMKV 基于 mmap 和 protobuf,性能更优,适合高频读写。NSKeyedArchiver 支持加密,适合敏感自定义对象。选择时需权衡数据敏感性和读写频率。
数据库方案对比与选型
原生 SQLite 灵活但繁琐;CoreData 封装但学习成本高、性能差,不推荐;FMDB 线程安全,适合大数据量;Realm 易用但稳定性存疑;WCDB 由微信优化,性能好、上手快,且迁移到 FMDB 成本低。实际开发中,WCDB 是较稳妥的选择。
Q&A
为什么选择KeyChain服务来存储用户账号密码?
因为KeyChain服务能够安全存储敏感数据,删除App后数据仍然保留,并支持iCloud同步。
NSUserDefault适合存储什么类型的数据?
NSUserDefault适合存储不敏感的App配置信息和用户偏好设置。
MMKV与NSUserDefault有什么区别?
MMKV是NSUserDefault的增强版,适合读写频繁且不敏感的数据,使用内存映射技术,数据安全性更高。
CoreData的学习成本高吗?
是的,CoreData的学习成本高,并且功能较差,不建议使用。
FMDB适合存储什么类型的数据?
FMDB适合存储较大数据量的数据,并且是线程安全的。
WCDB有什么特别之处?
WCDB是微信封装的Sqlite,优化了性能,使用成本低,推荐使用。