Метод didReceiveNotificationResponse не вызывается, когда приложение запускается с помощью прокрутки уведомления из закрытого состояния

#ios #objective-c #push-notification #apple-push-notifications #salesforce-marketing-cloud

#iOS #objective-c #push-уведомление #apple-push-уведомления #salesforce-маркетинг-облако

Вопрос:

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

 - (void)userNotificationCenter:(UNUserNotificationCenter *)center
   didReceiveNotificationResponse:(UNNotificationResponse *)response
    withCompletionHandler:(void (^)())completionHandler
    {
       // Sending analytics to my server
 }
  

Я проверяю это через свой сервер аналитики, и я вижу, что все запуски в фоновом режиме с помощью прокрутки уведомлений отражаются, а другой — нет. В обоих случаях я использую один и тот же API, поэтому в идеале он должен обновляться.

Ниже приведен мой didFinishLaunchingWithOptions метод:

 -(BOOL)application:(UIApplication*) application didFinishLaunchingWithOptions:(NSDictionary*) launchOptions
{
 dispatch_async(dispatch_get_main_queue(), ^(void){
    //Run UI Updates
    if (@available(iOS 10, *)) {
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if( !error ) {
            // required to get the app to do anything at all about push notifications
            dispatch_async(dispatch_get_main_queue(), ^{
                [[UIApplication sharedApplication] registerForRemoteNotifications];
            });
            NSLog( @"Push registration success." );
        } else {
            NSLog( @"Push registration FAILED" );
            NSLog( @"ERROR: %@ - %@", error.localizedFailureReason, error.localizedDescription );
            NSLog( @"SUGGESTIONS: %@ - %@", error.localizedRecoveryOptions, error.localizedRecoverySuggestion );
        }
        }];
    }
});
  

Добавление содержимого моего уведомления, которое я получаю от стороннего поставщика услуг (Salesforce):

 {
    "_h" = "V6bdjs7jjkqv/POIIIII";
    "_m" = MjJhJkKkK;
    "_mt" = 1;
    "_r" = "9dsdsjkk-3344dd-4edd-ade33-jhdj999";
    "_sid" = SFMC;
    aps =     {
        alert =         {
            body = test;
            subtitle = "Push Test";
            title = "Push Test";
        };
        "mutable-content" = 1;
        sound = default;
    };
}
  

Я Remote Notifications Background Modes также включил from.

введите описание изображения здесь

Комментарии:

1. В каком состоянии находилось приложение в момент нажатия на уведомление?

2. Оно не было запущено?

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

4. Я видел пару ответов с этим решением. Но, чтобы заставить мою аналитику работать, мне нужно пройти notification.response.notification.request . Я не получу эти данные launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] , верно? Есть ли какой-нибудь способ получить это? Тогда я могу обработать это с помощью пользовательской функции.

5. Что внутри notification.response.notification.request ? Вы можете получить всю информацию о своем уведомлении внутри опции запуска.