swift - 用于恢复不同数据模型的硬编码 NSUserActivityTypes

标签 swift ios13 restore nsuseractivity

从 iOS 13 开始,Apple recommends使用附加到场景的 NSUserActivity 对象存储用户状态,所以我一直在尝试 a) 更好地理解 NSUserActivity 的工作原理和 b) 在我自己的代码中实现它。在阅读 Apple 的文档时,我遇到了这段代码:

        class var activityType: String {
        let activityType = ""

        // Load our activity type from our Info.plist.
        if let activityTypes = Bundle.main.infoDictionary?["NSUserActivityTypes"] {
            if let activityArray = activityTypes as? [String] {
                return activityArray[0]
            }
        }

        return activityType
    }

我明白 什么 这是这样做的(它在 Info.plist 文件中查找名为“NSUserActivityTypes”的条目,如果它存在,它会尝试获取关联的 activityTypes 数组,然后读取数组中的第一项),但我不这样做t 明白是为什么 .特别是,我不明白为什么我们只读取 activityArray 中的第一项。在这种情况下,我们知道第一个(也是唯一的项目)是“com.apple.apple-samplecode.StateRestoration.activity”,因为我们必须手动创建该 plist 条目。但我不明白为什么我们要硬编码查看数组的第一项以获取事件类型,因为如果我们知道我们将只返回字符串“com.apple.apple-samplecode”。 StateRestoration.activity”,为什么不把代码写成这样:

class var activityType: String {
       return "com.apple.apple-samplecode.StateRestoration.activity"
    }


我以前从未使用过 NSUserActivity,我知道它可以(通常是?)用于状态保存/恢复以外的其他事情,因此您的应用程序可以支持许多不同类型的用户事件(切换,Siri 集成) , 等等。)。所以我会假设我们希望我们的代码尽可能健壮,而不是对我们可能收到的 NSUserActivity 对象的种类做任何假设。

也许对 NSUserActivity 有更多经验的人可以帮助解释 NSUserActivity 可能传递给我的应用程序的方式,以及为什么我们可以在数组的第一个元素中进行硬编码,而在其他地方我们想要检查传入的事件是正确的事件类型(即使我们知道我们支持的一系列事件只有一种事件,所以大概我们首先会收到一种事件?)。

此外,这并不是 Apple 的示例代码所独有的... this blog在阅读 Info.plist 文件时,post 也采用了类似的方法:

extension Bundle {
    var activityType: String {
        return Bundle.main.infoDictionary?["NSUserActivityTypes"].flatMap { ($0 as? [String])?.first } ?? ""
    }
}

最佳答案

我认为这两个示例代码都只是解释状态如何工作的虚拟方式。
在那里,他们使用单个恢复 ID ( com.apple.apple-samplecode.StateRestoration.activity ) 但您的应用程序可能不止于此,因此如您所说,示例代码不再有意义。

另请注意,即使使用单个恢复 ID,您也拥有所有 NSUserActivity字段(包括 userInfo )来帮助您区分状态。当然,让非常不同的状态共享相同的恢复 ID 会很脏。

关于swift - 用于恢复不同数据模型的硬编码 NSUserActivityTypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59815029/

相关文章:

ios - 如何制作这个动画?即。连接共享元素

javascript - 如何保存和恢复表单字段内的多个值(仅使用前端逻辑)

MySQL InnoDB 数据库恢复

ios - UIPageViewController 指示器不改变颜色

ios - 在 Facebook "Share"按钮 shareContent 中包含 branch.io 深层链接(iOS、Swift)

swift - 在 Storyboard中使用 View Controller 以使教学应用程序不重载内存的最佳方法是什么?

ios - MFMailComposeViewController 在 iOS 13 模拟器和设备中的行为不同

swift - 如何更改 DispatchTimeInterval 以获得成员毫秒

swift - CoreData 崩溃错误 Xcode 11 Beta、IOS 13 Beta

amazon-web-services - 有没有办法一次恢复多个快照?