从 iOS 13 开始,Apple 建议使用附加到场景的 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 数组,然后读取数组中的第一项),但是什么我不明白是为什么。特别是,我不明白为什么我们只读取 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 集成, ETC。)。所以我会假设我们希望我们的代码尽可能的健壮,不要对我们可能收到的 NSUserActivity 对象的种类做任何假设。
也许对 NSUserActivity 有更多经验的人可以帮助解释将 NSUserActivity 传递给我的应用程序的方式,以及为什么我们可以在数组的第一个元素中硬编码,而在其他地方我们想检查是否传入活动是正确的活动(即使我们知道我们支持的活动数组只有一种活动,所以大概我们一开始只会收到一种活动?)。
此外,这并不是 Apple 的示例代码所独有的……这篇博文在阅读 Info.plist 文件时也采用了类似的方法:
extension Bundle {
var activityType: String {
return Bundle.main.infoDictionary?["NSUserActivityTypes"].flatMap { ($0 as? [String])?.first } ?? ""
}
}