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

Как Facebook Messenger очищает push-уведомления от экрана блокировки, если вы читаете их на рабочем столе?

Когда я получаю сообщение на Facebook, я получаю push-уведомление на экране блокировки (iOS). Затем я прочитал это сообщение на рабочем столе. Сразу после этого это push-уведомление исчезает без каких-либо взаимодействий с телефоном. Как я могу реализовать ту же самую вещь для удаления устаревших уведомлений?

Второе использование может быть сшиванием уведомлений вместе. Например, Instagram отправляет вам нажатие, когда кому-то понравилась ваша фотография. После 20 нравится, что ваш экран уведомлений разрушен и нечитабелен. Но использование того же принципала, что и Facebook, кажется возможным удалить предыдущее уведомление того же типа и создать новый с увеличенным счетчиком. Нет "Пользователь понравился фото X, Пользователь B понравился фото Y и т.д.", Но "20 пользователям понравилось фото Z".

Я видел пару шагов по подобным темам здесь, но пока ответа пока нет. Спасибо!

4b9b3361

Ответ 1

См. Улучшения многозадачности и, в частности, тихие push-уведомления. Используя тихий push, вы можете уведомить свое приложение о том, что новый контент доступен, а также загрузить этот контент и/или установить номер значка, например, без отображения уведомления в "Центре уведомлений". Вам нужно будет установить UIBackgroundModes с удаленным уведомлением, чтобы сделать эту работу.

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

Ответ 2

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

В примере на Facebook у них явно хватает мощности сервера, чтобы просто обнаружить, когда вы прочитали сообщение на своем рабочем столе и отправили push на свои устройства, чтобы убедиться, что уведомление больше не существует.

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

Ответ 3

Это новая функция в iOS 7, называемая Silent Push Notification, ее многозадачная функция.

Что вам понадобится:

1 - Регистрация удаленных уведомлений в файле didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeNewsstandContentAvailability|
      UIRemoteNotificationTypeBadge |
      UIRemoteNotificationTypeSound |
      UIRemoteNotificationTypeAlert)];

}

2 - Внедрить следующий метод в ApplicationDelegate:

   - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
      handler(UIBackgroundFetchResultNewData);


    // Possibl Results:
//    typedef enum {
//        UIBackgroundFetchResultNewData, //Download success with new data
//        UIBackgroundFetchResultNoData,  //No data to download
//        UIBackgroundFetchResultFailed   //Downlod Failed
//    } UIBackgroundFetchResult;
}

3 - Установить UIBackgroundModes внутри приложения info.plist:

> <key>UIBackgroundModes</key> <array>
>     <string>remote-notification</string> </array>

Ответ 4

Предупреждение: я не пробовал это, это просто идея!

В iOS 7 вы можете попробовать отправить молчаливое уведомление "контент-доступ" пользователю. Это разбудит приложение в фоновом режиме и позволит вам запустить некоторый код. На заднем плане вы могли бы сделать

[[UIApplication sharedApplication] setApplicationBadgeNumber:0];
[[UIApplication sharedApplication] setApplicationBadgeNumber:newBadgeNumber];

это должно очистить все уведомления, которые находятся в центре уведомлений. Затем вы можете опубликовать локальное уведомление с данными, которые были получены в вашем словаре userInfo, и это выглядело бы так, как если бы старые были заменены новым!

Опять же, просто идея...