iOS 持久化
🗂️ 1. UserDefaults(偏好设置)
适用场景:轻量级用户配置(如开关状态、字体大小、首次启动标识)。
特点:
- 键值对存储,支持基础类型(
String
、Int
、Bool
、Array
、Dictionary
等)。 - 数据自动保存到沙盒的
Library/Preferences
目录(.plist
文件),iTunes同步时会备份。 - 线程安全,但建议在主线程操作。
代码示例(Swift):
// 存储数据
UserDefaults.standard.set("user123", forKey: "username")
UserDefaults.standard.set(true, forKey: "darkModeEnabled")
UserDefaults.standard.synchronize() // 立即同步(iOS 12+ 通常可省略)
// 读取数据
let username = UserDefaults.standard.string(forKey: "username") ?? "defaultUser"
最佳实践:
- 使用枚举管理键名,避免拼写错误:
enum ConfigKey { static let username = "username" }
- 敏感数据勿用:
.plist
文件易被破解。
📝 2. Plist文件(属性列表)
适用场景:静态配置(如应用内菜单选项、城市列表)。
特点:
- XML/二进制格式,支持与UserDefaults相同的数据类型。
- 文件路径通常位于沙盒的
Documents
或Library/Caches
目录。
代码示例(Swift):
// 写入文件
let config: [String: Any] = ["apiEndpoint": "https://api.example.com", "maxRetries": 3]
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
.appendingPathComponent("AppConfig.plist")
(config as NSDictionary).write(to: fileURL, atomically: true)
// 读取文件
if let data = NSDictionary(contentsOf: fileURL) as? [String: Any] {
print("API Endpoint: \(data["apiEndpoint"] ?? "")")
}
注意:
- 大文件读写性能较低,适合中小型数据。
🔐 3. Keychain(钥匙串)
适用场景:敏感信息(如密码、Token、加密密钥)。
特点:
- 硬件级加密(Secure Enclave),数据删除应用后仍保留。
- 支持iCloud跨设备同步。
- 通过
Security.framework
的C接口或封装库(如KeychainAccess)操作。
代码示例(使用KeychainAccess库):
import KeychainAccess
let keychain = Keychain(service: "com.example.app")
// 存储密码
try? keychain.set("p@ssw0rd", key: "userPassword")
// 读取密码
let password = try? keychain.get("userPassword")
注意事项:
- 避免存储超过1MB的数据。
🔄 4. 归档(NSKeyedArchiver)
适用场景:自定义对象持久化(如用户配置模型)。
要求:对象需实现 NSCoding
或 Codable
协议。
代码示例(Codable
协议):
struct AppConfig: Codable {
var theme: String
var fontSize: Int
}
// 归档存储
let config = AppConfig(theme: "Dark", fontSize: 16)
if let data = try? JSONEncoder().encode(config) {
UserDefaults.standard.set(data, forKey: "appConfig")
}
// 解档读取
if let data = UserDefaults.standard.data(forKey: "appConfig"),
let config = try? JSONDecoder().decode(AppConfig.self, from: data) {
print("Theme: \(config.theme)")
}
📊 5. Core Data / SQLite
适用场景:复杂配置关系(如用户多套配置模板、历史记录)。
特点:
- 支持查询、事务、版本迁移,适合结构化数据。
- Core Data 是ORM框架,底层可选用SQLite存储。
简化流程:
- 创建数据模型(
.xcdatamodeld
文件)。 - 使用
NSPersistentContainer
管理堆栈:
let container = NSPersistentContainer(name: "ConfigModel")
container.loadPersistentStores { _, error in
if let error = error { fatalError("加载失败: \(error)") }
}
let context = container.viewContext
- 存储与查询(略,需定义NSManagedObject子类)。
💎 方案选型建议
方案 | 数据量 | 安全性 | 适用场景 |
---|---|---|---|
UserDefaults | 小 | 低 | 用户偏好设置 |
Plist文件 | 中小 | 低 | 静态配置 |
Keychain | 极小 | 高 | 密码、Token等敏感数据 |
归档 | 中小 | 中 | 自定义对象 |
Core Data | 大 | 中高 | 复杂结构化配置 |
💎 总结
iOS配置持久化需根据数据类型、安全性和复杂度综合选择:
- 轻量级配置:优先用
UserDefaults
或Plist文件
。 - 敏感信息:必须用
Keychain
,避免明文存储。 - 自定义对象:通过
归档
或Codable
协议转换存储。 - 多配置模板/历史记录:采用
Core Data
管理关系型数据。
提示:所有方案均依赖iOS沙盒机制,确保应用数据隔离存储。开发时需遵循目录规范(如临时数据存
tmp
,可重建数据存Caches
)。