当用户获得新的iPhone时,iCloud可以从不同的设备恢复应用程序数据,后者从UserDefaults和密钥链复制信息。
当用户从iPhone A -> iPhone B迁移时,这给我的应用程序带来了问题,因为该应用程序存储了一个不定期更改的设备特定的安全密钥。
。
如果我能够检测到iCloud数据恢复,或者升级到新设备,这将很容易修复。这将允许我重置持久化设备标识符并清除持久化旧安全密钥。
但我无法找到这样做的方法,因为苹果阻止访问任何唯一的设备标识符,因此您无法判断应用程序是否已移动到新设备。它也不会对何时发生iCloud还原进行回调。我可以检查硬件设备模型的变化,但有时当手机损坏或丢失时,用户会用相同的硬件替换手机。
有没有办法检测应用程序迁移到新设备和/或防止从一个设备到另一个设备克隆应用程序数据的iCloud备份?
发布于 2022-11-18 14:22:24
您可以通过在iCloud中保存文件来检测应用程序是否是从.applicationSupportDirectory备份中安装的。这个目录没有备份,所以如果你的应用程序在那里保存一个文件而没有看到它,那就意味着(a)你的应用程序第一次运行,或者(b)应用程序是从备份中恢复的。
当检测到还原时,您可以使用它作为标志执行任何特殊的清理。
如果您需要区分第一次安装和恢复,只需将第二个标志保存到UserDefaults。如果标志存在于UserDefaults中,但标志文件不存在于.applicationSupportDirectory中,那么您就知道它是iCloud还原。
在本文撰写之时,该技术已经通过了App的一次审查。
class RestoredAppDetector {
func saveInstallationFlagFile() {
if let applicationSupportDirectory = try? FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true) {
var flagFile = applicationSupportDirectory.appendingPathComponent("app_installed.txt", isDirectory: false)
if (!FileManager.default.createFile(atPath: flagFile.path, contents: "true".data(using: .utf8)) ) {
NSLog("Filed to create flag file")
}
var values = URLResourceValues()
values.isExcludedFromBackup = true
do {
try flagFile.setResourceValues(values)
}
catch {
NSLog("Failed to set resource value")
}
}
else {
NSLog("Could not create application support directory.")
}
}
func installationFlagFileExists() -> Bool {
if let applicationSupportDirectory = try? FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false) {
let flagFile = applicationSupportDirectory.appendingPathComponent("app_installed.txt", isDirectory: false)
if (FileManager.default.fileExists(atPath: flagFile.path)) {
NSLog("Flag file exists")
return true
}
else {
NSLog("Flag file does not exist")
}
}
else {
NSLog("Could not find application support directory.")
}
return false
}
}https://stackoverflow.com/questions/74211063
复制相似问题