Push-уведомления, которые запускают фоновое обновление перед отображением push-уведомлений VS тихий push
Я хочу реализовать функцию фонового обновления в моем приложении для получения толчка. Непосредственно перед тем, как пользователю будет отображено push-уведомление, я хочу загрузить новые сообщения из моего бэкэнда (Parse.com) и сохранить их в массив. Отсюда я следую инструкции: http://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/updating_an_application_in_the_background/
Я не уверен, насколько точно это руководство. В нем говорится: iOS 7 (и более поздняя версия) расширяет обычные push-уведомления, предоставляя приложениям возможность обновлять контент в фоновом режиме, прежде чем уведомлять пользователя, чтобы пользователь мог открыть приложение и немедленно представить новый контент.
Поэтому я попытался реализовать свой фоновый толчок так:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
if([[userInfo objectForKey:@"aps"] objectForKey:@"content-available"]){
NSLog(@"Doing the background refresh");
UINavigationController *navigationController=(UINavigationController *)[[[UIApplication sharedApplication] keyWindow] rootViewController];
MyViewController *myViewController = (MyViewController *)[[navigationController viewControllers] objectAtIndex:1];
[myViewController.currentUser refreshMessagesArrayWithCompletionHandler:^(BOOL successful, BOOL newMiaos) {
NSLog(@"messages refreshed the array now has %lu messages",(unsigned long)[myViewController.currentUser.messages count]);
handler(UIBackgroundFetchResultNewData);
}];
}
}
Вызывается фоновое обновление и отображается push-уведомление, однако push-уведомление не ожидает завершения фоновой задачи. Это просто отображается, как только оно получено. Это правильная функциональность? Из приведенного выше руководства видно, что уведомление не будет отображаться до тех пор, пока не будет выполнена фоновая задача.
Затем я попытался выполнить тихое уведомление, при этом приложение загружает сообщения в фоновом режиме при получении push-уведомления, но уведомление не отображается. Так что я делаю это, запуская локальное уведомление вместо завершения загрузки. Это действительно правильный способ сделать это? Традиционные приложения, такие как WhatsApp, запускают фоновое обновление с помощью тихого уведомления, а затем запускают локальное? Кажется немного хак Конечно, идея фонового толчка состоит в том, чтобы подготовить данные перед показом уведомления, но это не совсем так работает.
Еще одна вещь, которую я заметил, заключается в том, что тихие уведомления имеют ограниченную скорость, они имеют более низкий приоритет, чем обычные push-уведомления, так что, безусловно, это также снижает эффективность приложения...
Любые указатели на это были бы очень благодарны. Просто пытаюсь разобраться, правильно ли я подхожу к этому или нет. Все кажется очень хакерским...
2 ответа
Я боролся с той же задачей в моем приложении обмена сообщениями. Мы хотели, чтобы пользователи увидели сообщение прямо перед тем, как пользователь нажмет на уведомление. С чем мы столкнулись:
- Ограничение размера полезной нагрузки. iOS 7 может иметь только 256 байт для полезной нагрузки
- одиночные тихие уведомления не запустят приложение, если оно не запущено
content-available
уведомления без тела оповещения могут даже не доставляться на устройство- Фоновая выборка не контролируется вашим приложением, поэтому вы можете никогда не получить желаемый сигнал, поэтому мы не можем полагаться на эту функцию. Но это может быть полезным в качестве дополнительного способа достижения того, что мы хотим
- iOS 8 имеет много места для полезной нагрузки - 2 КБ
- если вы отправите оповещение тела и
content-available
- он будет доставлен в большинстве случаев, и приложение сможет его обработать
Таким образом, мы пришли к единственному приемлемому решению: мы решили сделать эту функцию только в ios8+. Мы отправляем видимые push-уведомления с content-available
ключ, который позволяет нам обрабатывать полезную нагрузку уведомления, если процесс запущен / заморожен, и оба могут представлять уведомление, если приложение не запущено. Если приложение получает push-уведомление, оно принимает текст предупреждения и записывает его в локальную базу данных, чтобы пользователь мог прочитать его в разговоре. Согласно нашей статистике, средний размер сообщения составляет не более 200 символов, поэтому в большинстве случаев никаких дополнительных запросов не требуется. Если сообщение длиннее 200 символов, мы расширяем тело полезной нагрузки дополнительным параметром, который используется для запроса текста в обработке push-уведомлений. Пользователь увидит обрезанную версию текста, но после выполнения запроса мы переписываем сообщение в локальной базе данных с полученным значением.
Таким образом, этот метод позволяет нам сразу же показать полученное сообщение пользователю в большинстве случаев +, если приложение не было запущено, мы отправляем запрос на наш сервер для получения пропущенных сообщений сразу после запуска приложения. Это самый быстрый и самый приемлемый случай, который мы могли получить на iOS. Надеюсь, мой опыт поможет вам реализовать то, что вы хотите.
Вы смешали несколько вещей вместе.
Если посмотреть на вашу ссылку, это руководство для xamarin
, Там может быть некоторая правильная информация, но если вы не используете xamarin
Я бы искал другой учебник.
Хорошим подходом было бы отправить пользователю уведомление в режиме без вывода сообщений и запуск локального уведомления, когда это будет сделано (что вовсе не хакерство).
Вот как работает WhatsApp:
Пока whatsApp находится в фоновом режиме, принимается одно push-уведомление (например, "5"), что сообщение не будет показано пользователю.
whatsApp получает его в методе application:didReceiveRemoteNotification:fetchCompletionHandler:
и проверяет на своих серверах, есть ли какие-либо уведомления до "5", которые пользователь не получил. Если это так, они будут извлекать эти данные со своих серверов и представлять их пользователю с помощью локальных уведомлений, что в основном является просто способом представления данных и совсем не относится к APNS.
Вы можете прочитать полный ответ и контекст в другом ответе, который я написал здесь