Я успешно использую фоновую загрузку в разрабатываемом мной приложении для iOS, но заметил странную ошибку, которую не могу устранить.
Первоначальный симптом заключался в том, что иногда, когда я запускал приложение, отображалось изображение запуска, а затем заменялось черным экраном. Если я нажму кнопку «Домой», а затем снова открою приложение, все будет хорошо, и приложение будет работать, как задумано. Я также заметил, что это происходит только в том случае, если я какое-то время не использовал приложение. Добавив кучу журналов, я понял, что черный экран при запуске возникает только в том случае, если ОС запускает фоновую выборку при запуске. Кажется, что если выборка не выполнялась какое-то время, а затем вы запускаете приложение, iOS запускает «фоновую» выборку в вашем запущенном в данный момент приложении. Ошибка возникает только в этой ситуации.
Я немного погуглил, и мне показалось, что одна из причин такого поведения может заключаться в том, что вы запускаете анимацию не в тот момент жизненного цикла приложения. Я провел аудит своего приложения и не нашел многого. Я также нашел это сообщение о переполнении стека, в котором описывается аналогичная проблема, за исключением того, что мое приложение не падает, и я ничего не делаю с фоновыми потоками в моей реализации application:performFetchWithCompletionHandler:
.
Я подумал, что следующим шагом будет создание минимального тестового примера, который все еще вызывает проблему. Итак, используя Xcode 6.1, я создал пустое приложение с одним представлением (Swift). Затем я проделал небольшую работу, чтобы добавить фоновую загрузку:
- Добавлено «Фоновое получение» в раздел «Фоновые режимы» на экране «Возможности» для моей цели.
Обновлен AppDelegate.swift, чтобы включить соответствующие фрагменты фоновой выборки.
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum); return true } func application(application: UIApplication!, performFetchWithCompletionHandler completionHandler: ((UIBackgroundFetchResult) -> Void)!) { completionHandler(UIBackgroundFetchResult.NewData); } }
Я не вносил никаких других изменений, а затем запустил приложение на устройстве. Чтобы ситуация возникла, я запустил несколько команд Simulate Background Fetch из Xcode, остановил приложение внутри Xcode, а затем подождал некоторое время (около 10 минут). Затем я перезапустил приложение из Xcode и испытал то же самое поведение, что и в моем реальном приложении.
На данный момент у меня возникают проблемы с тем, чтобы не сделать вывод, что это какая-то ошибка в SDK. Кто-нибудь еще видел эту ситуацию? Есть ли обходной путь для этого?