xDocxDoc
AI
前端
后端
iOS
Android
Flutter
AI
前端
后端
iOS
Android
Flutter
  • iOS 持久化方案

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存储。

简化流程:

  1. 创建数据模型(.xcdatamodeld 文件)。
  2. 使用 NSPersistentContainer 管理堆栈:
let container = NSPersistentContainer(name: "ConfigModel")  
container.loadPersistentStores { _, error in  
    if let error = error { fatalError("加载失败: \(error)") }  
}  
let context = container.viewContext
  1. 存储与查询(略,需定义NSManagedObject子类)。

💎 方案选型建议

方案数据量安全性适用场景
UserDefaults小低用户偏好设置
Plist文件中小低静态配置
Keychain极小高密码、Token等敏感数据
归档中小中自定义对象
Core Data大中高复杂结构化配置

💎 总结

iOS配置持久化需根据数据类型、安全性和复杂度综合选择:

  1. 轻量级配置:优先用 UserDefaults 或 Plist文件。
  2. 敏感信息:必须用 Keychain,避免明文存储。
  3. 自定义对象:通过 归档 或 Codable 协议转换存储。
  4. 多配置模板/历史记录:采用 Core Data 管理关系型数据。

提示:所有方案均依赖iOS沙盒机制,确保应用数据隔离存储。开发时需遵循目录规范(如临时数据存tmp,可重建数据存Caches)。

最后更新: 2025/8/26 10:07