it-swarm.com.ru

Обработка push-уведомлений при завершении работы приложения

Когда мое приложение не запускается и получает Push-уведомление, если я нажимаю на это уведомление, приложение запускается, но затем оно не запрашивает пользователя с настроенным Alert-View, спрашивая его, хотят ли они просмотреть Содержание уведомления или нет. Он просто запускается и сидит там.

Push-уведомления работают отлично, когда приложение работает - как активное приложение или в фоновом режиме - но ничего не работает, когда приложение не запущено.

Я попытался выйти из функции launchOptions NSDictionary в приложении: didFinishLaunchingWithOptions: чтобы увидеть, какую нагрузку он приносит, но он выглядит как "(null)". Таким образом, он в основном не содержит ничего - что не имеет смысла, потому что он не должен содержать загрузку Уведомления?

У кого-нибудь есть идеи, как заставить Push-уведомления работать, когда они приходят, когда приложение еще не запущено?

Я имею в виду, как обрабатывать Push-уведомления, когда приложение не работает. Что если, если вы получили много уведомлений и не открыли приложение, вы также не коснулись панели уведомлений системы. Как вы сохраняете эти Push для последующего поиска.

31
Hasmukh D.

Что касается вашего вопроса, нет способа удержать все уведомления при открытии приложения, лучше вызвать API, чтобы получить все уведомления в соответствии с отметкой времени от вашего бэкэнда/сервера, как это делает Facebook.

10
Vizllx

1) Когда приложение работает в фоновом режиме и Когда приложение работает на переднем плане application:didReceiveRemoteNotification: метод будет вызываться, как показано ниже.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if (application.applicationState == UIApplicationStateInactive)
    {
        // opened from a Push notification when the app was on background
        NSLog(@"userInfo->%@", [userInfo objectForKey:@"aps"]);
    }
    else if(application.applicationState == UIApplicationStateActive)
    {
        // a Push notification when the app is running. So that you can display an alert and Push in any view
        NSLog(@"userInfo->%@", [userInfo objectForKey:@"aps"]);
    }
}

2) Когда приложение не запущено (закрыто) тогда будет вызван метод application:didFinishedLaunchingWithOptions.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions != nil)
    {
        // opened from a Push notification when the app is closed
        NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (userInfo != nil)
        {
             NSLog(@"userInfo->%@", [userInfo objectForKey:@"aps"]);
        }
    }
    else
    {
        // opened app without a Push notification.
    }
}

3) Нет способа удалить конкретное уведомление с. Чтобы удалить все уведомления из вашего приложения, чтобы они не отображались в Центре уведомлений, когда пользователь открывает приложение из одного из них, нужно установить для значка приложения значение 0.

34
Rahul Patel

Приложение не обрабатывает Push-уведомления в фоновом режиме, то, что на самом деле делает ОС, это разбудит приложение, когда вы нажмете в уведомлении. Вы можете поймать этот момент следующим образом:

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

        if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
      // Your app has been awoken by a notification...
        }
   }
7
Javier Calatrava Llavería

Вы можете получать уведомления, доставленные в ваше приложение, используя метод getDeliveredNotifications(completionHandler:) . Обратите внимание, что это возвращает только те уведомления, которые в данный момент отображаются в Центре уведомлений, а не те, которые были вручную очищены пользователем.

UNUserNotificationCenter.current().getDeliveredNotifications { notifications in

    // notifications: An array of UNNotification objects representing the local
    // and remote notifications of your app that have been delivered and are still
    // visible in Notification Center. If none of your app’s notifications are
    // visible in Notification Center, the array is empty.

    // As said in the documentation, this closure may be executed in a background
    // thread, so if you want to update your UI you'll need to do the following:
    DispatchQueue.main.sync { /* or .async {} */ 
        // update UI
    }
}
4
nyg

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

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

3
neo D1

Вы можете отобразить предупреждение после запуска ранее завершенного приложения из уведомления, подобного этому:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { // display the alert }

0
Bogdan Razvan