首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止/检测app数据在iCloud和UserDefaults中的迁移

防止/检测app数据在iCloud和UserDefaults中的迁移
EN

Stack Overflow用户
提问于 2022-10-26 16:18:30
回答 1查看 33关注 0票数 0

当用户获得新的iPhone时,iCloud可以从不同的设备恢复应用程序数据,后者从UserDefaults和密钥链复制信息。

当用户从iPhone A -> iPhone B迁移时,这给我的应用程序带来了问题,因为该应用程序存储了一个不定期更改的设备特定的安全密钥。

  1. 恢复的安全密钥可能过期(一个旧的备份)。
  2. 用户可以继续使用iPhone A和iPhone B,导致他们存储的安全密钥与旋转不同步。

如果我能够检测到iCloud数据恢复,或者升级到新设备,这将很容易修复。这将允许我重置持久化设备标识符并清除持久化旧安全密钥。

但我无法找到这样做的方法,因为苹果阻止访问任何唯一的设备标识符,因此您无法判断应用程序是否已移动到新设备。它也不会对何时发生iCloud还原进行回调。我可以检查硬件设备模型的变化,但有时当手机损坏或丢失时,用户会用相同的硬件替换手机。

有没有办法检测应用程序迁移到新设备和/或防止从一个设备到另一个设备克隆应用程序数据的iCloud备份

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-18 14:22:24

您可以通过在iCloud中保存文件来检测应用程序是否是从.applicationSupportDirectory备份中安装的。这个目录没有备份,所以如果你的应用程序在那里保存一个文件而没有看到它,那就意味着(a)你的应用程序第一次运行,或者(b)应用程序是从备份中恢复的。

当检测到还原时,您可以使用它作为标志执行任何特殊的清理。

如果您需要区分第一次安装和恢复,只需将第二个标志保存到UserDefaults。如果标志存在于UserDefaults中,但标志文件不存在于.applicationSupportDirectory中,那么您就知道它是iCloud还原。

在本文撰写之时,该技术已经通过了App的一次审查。

代码语言:javascript
复制
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
    }
    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74211063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档