быстрый запуск кода в периодически фоновом режиме - PullRequest
0 голосов
/ 02 июля 2018

моему приложению swift необходимо периодически запускать фрагмент кода, даже находясь в фоновом режиме. Каков наилучший способ сделать это? я пытался DispatchQueue.global(qos: .background).async но это не сработало

новая попытка:

я добавил это в свой ViewController:

private var time: Date?
private lazy var dateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateStyle = .short
    formatter.timeStyle = .long
    return formatter
}()

func fetch(_ completion: () -> Void) {
    time = Date()
    completion()
}

и это в мой AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
    // Override point for customization after application launch.
    return true
}

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    if let tabBarController = window?.rootViewController as? UITabBarController,
        let viewControllers = tabBarController.viewControllers
    {
        for viewController in viewControllers {
            if let fetchViewController = viewController as? ViewController {
                fetchViewController.fetch {
                    completionHandler(.newData)
                    print("fired")
                }
            }
        }
    }
}

и поставить точку останова на completionHandler(.newData). Но когда я запускаю приложение, точка останова никогда не срабатывает. и оператор print никогда не выполняется.

1 Ответ

0 голосов
/ 02 июля 2018

iOS не позволяет вашему приложению поддерживать запущенные процессы так, как вам нравится, пока приложение работает в фоновом режиме. Когда он будет задним фоном, у вас будет немного времени для выполнения некоторых задач (около пары минут), прежде чем он остановится.

Затем вам нужно использовать фоновую выборку, чтобы периодически получать новую информацию для вашего приложения.

На веб-сайте Ray Wenderlich имеется хорошее руководство по различным режимам фона, поддерживаемым iOS: RayWenderlich - Режимы фона .

Существует также руководство на портале разработчиков Apple , в котором объясняется, что вы можете и не можете делать, когда приложение работает в фоновом режиме.

Реализация долгосрочных задач

Для задач, для реализации которых требуется больше времени выполнения, необходимо запросить определенные разрешения для их запуска в фоновом режиме без их приостановки. В iOS в фоновом режиме разрешено запускать только определенные типы приложений:

  • Приложения, которые воспроизводят звуковой контент для пользователя в фоновом режиме, например приложение музыкального проигрывателя
  • Приложения, которые записывают аудиоконтент в фоновом режиме
  • Приложения, которые постоянно информируют пользователей об их местонахождении, например приложение для навигации
  • Приложения, поддерживающие передачу голоса по Интернет-протоколу (VoIP)
  • Приложения, которые должны регулярно загружать и обрабатывать новый контент
  • Приложения, которые регулярно получают обновления от внешних аксессуаров
  • Приложения, которые реализуют эти сервисы, должны декларировать сервисы, которые они поддерживают, и использовать системные инфраструктуры для реализации соответствующих аспектов этих сервисов.

Объявление сервисов позволяет системе узнать, какими сервисами вы пользуетесь, но в некоторых случаях именно системные платформы фактически препятствуют приостановке вашего приложения.

UPDATE:

Во-первых, я бы не помещал свой код обновления в ViewController, возможно, VC не находится в памяти во время операции фоновой выборки. Создайте отдельный класс или что-то, что связано с извлечением и хранением данных, а затем в функции ViewControllers viewWillAppear загрузите последние доступные данные.

Для тестирования операций фоновой выборки в xcode выберите Debug из меню, а затем выберите Simulate Background Fetch. Это запустит приложение и вызовет функцию performFetchWithCompletionHandler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...