2016-05-19 2 views
3

Я использую удаленное уведомление с доступным содержимым: флаг истины для запуска приложения в фоновом режиме при молчаливом уведомлении push и обработки или извлечения обновлений из удаленного API. Код выполняется отлично, когда приложение находится на переднем плане или в состоянии приостановлено после предыдущего запуска.Фоновая задача по удаленному уведомлению приостановлена ​​через короткое время

Во время тестов в фоновом режиме, когда приложение запускается системой на основе входящего молчащего push-уведомления, код обрабатывается только частично, и приложение быстро приостанавливается примерно через 150 мс. Я ожидал, что приложение получит 30 секунд для обработки входящего уведомления и его полезной нагрузки. Нужно ли настраивать возможности приложения или запрашивать фоновое задание, если мне нужно больше времени для обработки и/или получения новых данных?

Цель развертывания iOS 8, тестирование на iOS 9. Xcode 7.3.1, Swift 2.2.1.

Возможности: Режимы Фоновые ON, Режимы работы: Дистанционные уведомления Enabled

AppDelegate

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 

    if let userInfo = userInfo as? [String: AnyObject] { 

     // Processing of the payload is done in separate Operation class (using Operations framework) 
     // The completion handler is called on the end of the processing/fetching in that operation 
     // But in case of launching the app in the background it never reaches the call of the completion handler 

     let parseNotificationOperation = ParseNotificationOperation(userInfo: userInfo, fetchCompletionHandler: completionHandler) 
     MainService.shared.enqueueApnsOperation(parseNotificationOperation) 
    } 
} 

ответ

4

Мартин Koles,

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

Вот как вы можете достичь его :)

В вас AppDelegate заявляют,

UIBackgroundTaskIdentifier backgroundTask; 

и когда вы получаете APNs внутри didReceiveRemoteNotification написать это,

if (!backgroundTask || backgroundTask == UIBackgroundTaskInvalid) { 
     backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
       //do all clean up job here gets called few seconds before expiration 
       [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; 
       backgroundTask = UIBackgroundTaskInvalid; 
     }]; 
    } 

EDIT

Just rea lized вы делаете использование Свифт так вот код для вас в быстрой :)

Объявите переменную backgroundTask в AppDelegate,

var backgroundTask : UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid 

и использовать его в didRecieveRemoteNotification, как показано ниже,

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 

    if let userInfo = userInfo as? [String: AnyObject] { 
     let parseNotificationOperation = ParseNotificationOperation(userInfo: userInfo, fetchCompletionHandler: completionHandler) 
     MainService.shared.enqueueApnsOperation(parseNotificationOperation) 

     if (backgroundTask == UIBackgroundTaskInvalid) { 
      backgroundTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler {() -> Void in 
       self.endTask() 
      } 
     } 
    } 
} 

Наконец написать метод аннулирует ваш обработчик истечения, как только вы закончите с ним :)

func endTask(){ 
    //do all your clean up here, this is called few seconds before the task expires. 
    UIApplication.sharedApplication().endBackgroundTask(backgroundTask) 
    backgroundTask = UIBackgroundTaskInvalid; 
} 

Вот и все :) Удачное приложение для кодирования :)

+0

Отлично работает, спасибо! –

+0

Всегда приветствую приятеля :) –

Смежные вопросы