Фоновая выборка PerformFetchWithCompletionHandler не работает?

Мое приложение хочет обновлять сервер о местоположении пользователей каждые 5 секунд, даже если приложение находится в фоновом режиме. Я реализовал для него фоновую выборку.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {        
        application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil))

        application.setMinimumBackgroundFetchInterval(5.0)

        return true
    }

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {

    completionHandler(UIBackgroundFetchResult.NewData)
    UpdateData()
}

func UpdateData(){
     print("UpdateData executes")
    // function to update data when ever this method triggers
}

но проблема в том

  1. Я не могу войти в метод performFetchWithCompletionHandler, пока не нажму Отладка>имитировать фоновую выборку
  2. Как я могу вызвать performFetchWithCompletionHandler каждые 5 секунд.

person Azhar    schedule 16.05.2018    source источник
comment
вы нашли какое-нибудь решение?   -  person Ramakrishna    schedule 21.12.2018


Ответы (1)


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

Функция setMinimumBackgroundFetchInterval позволяет указать только минимальный интервал времени между фоновыми загрузками, чтобы свести к минимуму потребление энергии и данных вашим приложением. Однако установленный здесь интервал вовсе не гарантирует, что ваше приложение сможет выполнять фоновую выборку так часто. Ключевое предложение в документации по этому поводу: " Извлекать содержимое оппортунистически в фоновом режиме...".

На данный момент единственный способ убедиться, что ваше приложение может выполнять определенные функции (включая получение данных с сервера) в фоновом режиме, — это регулярно отправлять бесшумные push-уведомления с вашего собственного сервера. Однако даже в этом случае система может решить не будить ваше приложение в ответ на беззвучное push-уведомление, если вашему приложению требуется слишком много времени для завершения выполнения в ответ на push-уведомление или если ваше приложение получает слишком много уведомлений.

person Dávid Pásztor    schedule 16.05.2018
comment
хорошо ... можно ли это сделать в фоновом режиме обновлений местоположения ... чтобы установить интервал получения местоположения в фоновом режиме, и как только этот интервальный метод / делегат получит вызов, отправьте сообщение на сервер с последним местоположением через интервал 5 секунд. - person Azhar; 16.05.2018
comment
@Azhar, вы можете попробовать использовать отложенные обновления местоположения, что является единственным способ установить временной интервал для периодического вызова делегата (имейте в виду, что GPS будет по-прежнему включен в течение всего времени, а не будет включаться каждые 5 минут в вашем случае). Кроме того, система может не дать вашему приложению достаточно времени для завершения фонового URLRequest. Я действительно не рекомендовал бы злоупотреблять обновлениями местоположения для регулярных фоновых сетевых запросов. - person Dávid Pásztor; 16.05.2018
comment
Во-первых, ваши пользователи будут испытывать серьезное снижение времени автономной работы из-за постоянного использования вашего приложения GPS, а во-вторых, Apple может отклонить ваше приложение из-за неправильного использования фоновых обновлений местоположения. - person Dávid Pásztor; 16.05.2018
comment
да, я уже сообщил клиенту, что это может быть вредно для времени автономной работы, и Apple может заставить поместить такой текст в описание приложения ... но он настоял на том, чтобы сделать это любой ценой :) - person Azhar; 17.05.2018