В нашем приложении мы хотим загрузить небольшой объем данных в ответ на push-уведомление. До сих пор push-уведомления работали плавно, запуская приложение в фоновом режиме и вызывая вызывающую функцию didReceiveRemoteNotification.
Проблема заключается в том, что после того, как этот метод вернется, приложение не получит больше процессорного времени, пока оно не будет перенаправлено снова, поэтому нет возможности извлекать эти данные асинхронно в фоновом режиме.
Уменьшая это до простейшего случая, я все еще не могу запустить асинхронный код.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[application setApplicationIconBadgeNumber:1];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[application setApplicationIconBadgeNumber:9];
completionHandler(UIBackgroundFetchResultNewData);
});
}
В ответ на push приложение запускается в фоновом режиме, а счетчик значков равен 1, но номер значка не установлен равным 9, пока приложение не будет запущено с главного экрана.
Если iOS не запускает приложение до тех пор, пока не будет вызван обработчик завершения, до 30 секунд?
В Info.plist указан фоновый режим удаленного уведомления, токовая полезная нагрузка содержит "контент-доступный": "1", и я не выхожу из приложения, перейдя в коммутатор приложений.
Чтобы добавить, мы используем Parse для отправки этого push-уведомления, используя следующий Javascript:
Parse.Push.send({
where: installationQuery,
data: {
"content-available": 1,
}
}, { success: function() {},
error: function(error) {}
});