Начиная с iOS 13 Apple рекомендует сохранять состояние пользователя с помощью объекта NSUserActivity, прикрепленного к сцена, поэтому я пытался а) лучше понять, как работает NSUserActivity и б) реализовать это в своем собственном коде. Работая с документацией 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", если он существует, он пытается получить связанный массив типов активности, а затем читает первый элемент в массиве), но я не понимаю, почему. В частности, я не понимаю, почему мы читаем только первый элемент в 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... эта запись в блоге также использует аналогичный подход при чтении файла Info.plist:
extension Bundle {
var activityType: String {
return Bundle.main.infoDictionary?["NSUserActivityTypes"].flatMap { ($0 as? [String])?.first } ?? ""
}
}