Как игнорировать удаленное / push-уведомление, когда приложение находится в фоновом режиме / завершено

Используемые технологии:

Чтобы дать вам справочную информацию, вот данные, которые я отправляю через FCM на сервере api.

{

    "priority": "high",
    "content_available": true,
    "alert": true,
    "sound": true,
    "registration_ids": [
         "<SOME_ID_HERE>", 
         "<SOME_ID_HERE>"
    ],
    "notification": {
        "title": "SOME TITLE",
        "body": "SOME BODY"
    },
    "data": {
        "some_key": "some_value",
        "some_key2": "some_value2"
    }
}

Приложение получает это правильно, и я правильно использую эти методы.

application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)

messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage)

messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String)

userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)

userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)

Есть ли способ каким-то образом игнорировать push-уведомление, когда приложение находится в фоновом режиме / завершается с помощью этого образца кода?

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    switch application.applicationState {
    case .inactive, .background:
        // Tell Firebase that we recieved the Push Notification
        self.messaging.appDidReceiveMessage(userInfo)

        // `PushNotification` is a model that parses the `userInfo` dictionary
        guard let pushNotification: PushNotification = PushNotification(userInfo) else {
            return // end code execution cause push cannot be parsed
        }

        if pushNotification.isSomeKindOfThing {
            // ignore
        } else {
            // do nothing so it will show
        }
    case .active:
        // handle when application is active
    }
}

Я стремлюсь к тому, чтобы когда я получаю push-уведомление, я могу либо игнорировать его, в зависимости от того, что находится в ключе "data".


person Zonily Jame    schedule 22.01.2018    source источник
comment
Вы не можете, когда приложение неактивно или завершено, ОС обрабатывает получение и доставку уведомления в приложение. Используйте беззвучные уведомления для уведомлений, которые вы хотели бы игнорировать, и обычных, которые вы хотите, чтобы iOS довела до пользователя.   -  person Sandeep Bhandari    schedule 22.01.2018
comment
@SandeepBhandari, да, но проблема заключается в реструктуризации того, как должна выполняться наша внутренняя push-отправка.   -  person Zonily Jame    schedule 22.01.2018
comment
Извините, я не уверен, что вы имеете в виду, если ваш вопрос заключается в том, как мой сервер узнает, находится ли приложение в фоновом или переднем плане, чтобы соответствующим образом построить полезную нагрузку. Этот подход используется фреймворком чата Quickblox, у них есть API, который они ударить каждый раз, когда клиентское приложение переходит в фоновый режим, applicationDidEnterBackground использует фоновый сеанс для обеспечения успешного завершения вызова API. Это означает, что вам нужна ненужная информация на вашем сервере о каждом состоянии устройства. Если вы спросите, стоит ли это того, я отвечу «нет». Но чем, если это ваше требование, продолжайте изменять свой бэкэнд-код   -  person Sandeep Bhandari    schedule 22.01.2018
comment
попробуйте удалить предупреждение с именем Dictionary или любой объект из полезных данных push-уведомлений, если они существуют, и проверьте.   -  person KKRocks    schedule 22.01.2018
comment
@SandeepBhandari, извините, вот еще одно объяснение, под реструктуризацией бэкэнда я имел в виду то, что если я использую тихие уведомления, необходимо изменить текущую реализацию backend api для отправки уведомлений, и да, я знаю, как это сделать, но я m в настоящее время ищет способ, если возможно, справиться с этим с помощью мобильной стороны.   -  person Zonily Jame    schedule 22.01.2018
comment
@ zonily-jame: хммм интересно, извините, но у меня сейчас нет предложений: P Насколько я знаю, это невозможно, но тогда может быть способ сделать это, поэтому я тоже буду ждать ответа, размещенного здесь :)   -  person Sandeep Bhandari    schedule 22.01.2018


Ответы (1)


Если вы удалите ключ content_available: true из тела даты push-уведомления. Тогда push-уведомления не будут получены, когда приложение находится в фоновом режиме или завершено.

person Taimoor Suleman    schedule 22.01.2018
comment
Спасибо за ввод, но для текущей настройки мне нужно иметь возможность анализировать и обрабатывать полученный push. - person Zonily Jame; 22.01.2018