Ответ 1
Похоже, что XJones и я смогли найти причину этого. Похоже, что это ошибка iOS с красным регистром или недокументированное поведение. Я подал это под Apple ошибка ID 12935031.
Неисправный сценарий, когда приложение, использующее существенное изменение местоположения основного местоположения или мониторинг региона, может не запускаться должным образом (или иметь другие непредвиденные последствия) из-за того, что с iOS 5 хранилища Core Data используют защиту данных ( шифрование) по умолчанию.
Шаги по воспроизведению:
1) Включите защиту защитного кода на устройстве
2) Создайте приложение, которое запустит "Мониторинг значимого местоположения" или "Мониторинг регионов" и продолжит его работу даже в фоновом режиме. То есть. Приложение, которое использует фоновое значительное изменение местоположения или мониторинг региона.
3) Дождитесь окончания работы батареи на устройстве (могут быть и другие причины)
4) Устройство выключится
5) Подключите устройство к Mac
6) Как только заряд будет достаточным, устройство загрузится. Важно: не отключайте устройство в это время.
7) Выход или вход в контролируемый диапазон или возникновение значительного изменения местоположения. Теперь устройство автоматически перезапустит приложение, так как оно зарегистрировано для мониторинга значимого местоположения или мониторинга региона.
8) Однако, поскольку устройство не было разблокировано пользователем (код доступа еще не введен), приложение не сможет прочитать ни один из защищенных файлов данных. В приложении "Основные данные" это приведет к тому, что постоянный координатор хранилища не сможет добавить файл постоянного хранилища в контекст управляемого объекта. Это приведет к сбою приложения или в зависимости от кода, используемого разработчиком, даже попытку reset базы данных. В других приложениях это может привести к сбоям по другим причинам, так как это непредвиденный недокументированный побочный эффект включенной функции защиты данных по умолчанию для хранилищ Core Data в iOS 5 и более поздних версиях.
Решение или обходной путь до тех пор, пока Apple не исправит это или, по крайней мере, документы, чтобы убедиться, что ваше приложение перестает отслеживать значительные изменения/регионы региона в приложенииWillTerminate или , чтобы отключить функцию защиты данных по умолчанию, установив NSFileProtectionNone для NSFileProtectionKey введите ключ словаря при добавлении хранилища основных данных в постоянный координатор хранилища., чтобы дождаться, когда хранилище файлов станет доступным, используя цикл while(), который проверяет доступность защищенных данных. Могут быть другие способы сделать это с помощью KVO, но этот метод работает надежно и проще всего вставлять в существующий код, не перерабатывая весь процесс запуска приложения.
Обновление: похоже, просто установить этот ключ недостаточно, если защита данных уже активна в хранилище. Вы должны вручную установить его:
[[NSFileManager defaultManager] setAttributes:[NSDictionary dictionaryWithObject:NSFileProtectionNone forKey:NSFileProtectionKey] ofItemAtPath:storePath error:nil];
Забастовкa > код >
Здесь исправление для приложений, которым необходим мониторинг фонового местоположения, благодаря большему количеству запросов от XJones и немного больше исследований в Apple, разбросанных документах:
while(![[UIApplication sharedApplication] isProtectedDataAvailable]) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5f]];
}
код >
Этот код идет до того, как вы попытаетесь добавить файл данных хранилища в постоянный координатор хранилища.
Обновление 2015: Вы также можете установить NSPersistentStoreFileProtectionKey в NSFileProtectionNone. Это будет правильно отключать защиту файлов (если вам это не нужно) и просто работать без каких-либо обходных решений. Причина, по которой он не работал в предыдущих попытках, состоит в том, что ключ словаря, который я тестировал, был неправильным.