You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何存储PHPersistentChangeToken?NSUserDefaults存储失败求助

解决NSUserDefaults无法存储PHPersistentChangeToken的问题

问题场景

尝试直接用NSUserDefaults存储PHPersistentChangeToken时触发报错:
存储代码:

UserDefaults.standard.set(PHPhotoLibrary.shared().currentChangeToken, forKey: "token")

报错信息:

[User Defaults] Attempt to set a non-property-list object <PHPersistentChangeToken: 0x600000e69f40: persistentHistoryToken=<NSPersistentHistoryToken - {
    "3F642A05-50EB-4DB3-8C26-3554B5F25849" = 110;
}>, version=1> as an NSUserDefaults/CFPreferences value for key token

原因

NSUserDefaults仅支持存储符合**属性列表(Property List)**规范的对象类型(NSString、NSNumber、NSDate、NSData、NSArray、NSDictionary),PHPersistentChangeToken不属于这类类型,无法直接存储。

正确的存储与读取方法

需要通过NSKeyedArchiver将token归档为Data,存入UserDefaults;读取时再用NSKeyedUnarchiver解档还原。

存储操作

if let token = PHPhotoLibrary.shared().currentChangeToken {
    do {
        let tokenData = try NSKeyedArchiver.archivedData(withRootObject: token, requiringSecureCoding: true)
        UserDefaults.standard.set(tokenData, forKey: "photoChangeToken")
    } catch {
        print("归档PHPersistentChangeToken失败:\(error.localizedDescription)")
    }
}

读取操作

if let tokenData = UserDefaults.standard.data(forKey: "photoChangeToken") {
    do {
        guard let changeToken = try NSKeyedUnarchiver.unarchivedObject(ofClass: PHPersistentChangeToken.self, from: tokenData) else {
            print("解档得到的token为空")
            return
        }
        // 在这里使用还原后的changeToken处理照片库变更逻辑
    } catch {
        print("解档PHPersistentChangeToken失败:\(error.localizedDescription)")
    }
}

内容的提问来源于stack exchange,提问作者DNB5brims

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:30:54