Подтвердить что ты не робот

Push-уведомления, которые запускают обновление фона перед показом push-уведомления VS silent push

Я хочу реализовать функцию обновления фона в своем приложении, когда будет получен 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-уведомление не дожидается завершения фоновой задачи. Он отображается только после его получения. Это правильная функциональность? В приведенном выше руководстве говорится, что уведомление не будет отображаться до завершения фоновой задачи.

Затем я начал пробовать молчаливое уведомление, это заставляет приложение загружать сообщения в фоновом режиме, когда нажимается, но не отображается уведомление. Поэтому я делаю это, открывая локальное уведомление, после завершения загрузки. Это действительно правильный способ сделать это? Как традиционные приложения, такие как whatsapp, запускают обновление фона с помощью молчаливого уведомления, а затем запускают локальный? Кажется немного взломанным. Разумеется, идея фонового нажатия состоит в том, чтобы подготовить данные перед показом уведомления, но это не совсем так.

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

Любые указатели на это будут действительно оценены. Просто пытаюсь опустить голову, если я подхожу к этому правильно или нет. Все кажется очень взломанным...

4b9b3361

Ответ 1

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

  • Ограничение размера полезной нагрузки. iOS 7 может иметь только 256 байт для полезной нагрузки
  • одиночные тихие уведомления не запускают приложение, если оно не работает
  • content-available уведомления без тела предупреждения могут даже быть доставлены на устройство
  • Фоновая выборка не контролируется вашим приложением, поэтому вы никогда не сможете получить желаемый сигнал, поэтому мы не можем полагаться на эту функцию. Но это может быть полезно в качестве дополнительного способа достижения желаемого.
  • iOS 8 имеет много места для полезной нагрузки - 2 КБ
  • если вы отправляете тело предупреждения и content-available - оно будет доставлено в большинстве случаев, и приложение сможет его обработать.

Итак, мы пришли к единственно приемлемому решению: мы решили сделать эту функцию только в ios8+. Мы отправляем видимые push-уведомления с помощью клавиши content-available, которая позволяет нам обрабатывать полезную нагрузку уведомления, если процесс запущен/заморожен, и оба могут представить уведомление, если приложение не запущено. Если приложение получает push-уведомление, оно принимает тело блогов и записывает его в локальную базу данных, поэтому пользователь может прочитать его в разговоре. Согласно нашей статистике, средний размер сообщения не более 200 символов, поэтому в большинстве случаев дополнительных запросов не требуется. Если сообщение длиннее 200 символов, мы расширяем тело полезной нагрузки дополнительным параметром, который используется для запроса текстового тела в обработке push-уведомлений. Пользователь увидит обрезанную версию текста, но после выполнения запроса мы переписываем сообщение в локальной базе данных с полученным значением.

Таким образом, этот метод позволяет нам сразу же отобразить полученное сообщение пользователю в большинстве случаев +, если приложение не было запущено, мы делаем запрос на наш сервер для получения отсутствующих сообщений сразу после запуска приложения. Это самый быстрый и самый приемлемый случай, который мы могли бы получить на iOS. Надеюсь, мой опыт поможет вам реализовать то, что вы хотите.

Ответ 2

Вы смешали несколько вещей вместе.

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

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

Вот как работает whatsApp:

В то время как whatsApp находится в фоновом режиме, получено одно push-уведомление (например, "5" ). msg не будет отображаться пользователю.

whatsApp получает его в методе application:didReceiveRemoteNotification:fetchCompletionHandler: и проверяет их серверы, если есть какие-либо уведомления до "5", которые пользователь не получил. В этом случае они будут извлекать эти данные со своих серверов и будут представлять их пользователю, используя локальные уведомления, которые в основном являются способом представления данных и вообще не связаны с APNS.

Вы можете прочитать полный ответ и контекст в другом ответе, который я написал здесь