Как добавить различные действия в зависимости от категории, определенной в полезной нагрузке входящего удаленного уведомления? Свифт ОБНОВЛЕНО - PullRequest
0 голосов
/ 13 июня 2019

Я внедряю push-уведомления в моих двух связанных приложениях и до сих пор могу отправлять уведомления, устройство на устройство и в тему.При получении уведомления отображается изображение по URL-адресу, отправленному с полезной нагрузкой.Моя цель - добавить действия к уведомлениям темы, и они будут разными для каждой темы.Ej.действия для "shop-promotions" уведомлений темы (а именно "buy") будут отличаться от уведомлений темы "новости" (а именно "play").Поэтому я решил отправить параметр «категория» в полезную нагрузку удаленного уведомления и использовать его для различения различных входящих уведомлений и отображения правильного набора действий.Можно ли определить действия в NotificationExtension.swift didReceive или обязательно также использовать пользовательский интерфейс для отображения действий?В https://www.pluralsight.com/guides/creating-ios-rich-push-notifications показано как возможно, но у меня это не получается.

Я объявляю их как:

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {

        print("NotificationService: dide receive called")
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)


        if let bestAttemptContent = bestAttemptContent {
            if let urlString = bestAttemptContent.userInfo["attachment-url"] as? String,
                let data = NSData(contentsOf: URL(string:urlString)!) as Data? {
                let path = NSTemporaryDirectory() + "attachment"
                _ = FileManager.default.createFile(atPath: path, contents: data, attributes: nil)

                do {
                    let file = URL(fileURLWithPath: path)
                    let attachment = try UNNotificationAttachment(identifier: "attachment", url: file,options:[UNNotificationAttachmentOptionsTypeHintKey : "public.jpeg"])
                    bestAttemptContent.attachments = [attachment]

                } catch {
                    print(error)

                }

                // Actions
                if let category = bestAttemptContent.userInfo["category"] as? String {

                    if category == "shop-promotions" {
                        let buy = UNNotificationAction(identifier: "buy", title: "Buy", options: [])
                        let close = UNNotificationAction(identifier: "close", title: "Close", options: [])

                        let category = UNNotificationCategory(identifier: "shop-promotions", actions: [buy,close], intentIdentifiers: ["buy","close"], options: [])
                        UNUserNotificationCenter.current().setNotificationCategories([category])
                    }
                }

            } // else {
            //                if let contentHandler: ((UNNotificationContent) -> Void) =
            //                    self.notificationContentHandler,
            //                    let content: UNNotificationContent = self.notificationContent {
            //                    contentHandler(content)  }
    

            let buy = UNNotificationAction(identifier: "buy", title: "Buy", options: [])
            let close = UNNotificationAction(identifier: "close", title: "Close", options: [])

            let category = UNNotificationCategory(identifier: "shop-promotions", actions: [buy,close], intentIdentifiers: [], options: [])
            UNUserNotificationCenter.current().setNotificationCategories([category])


            contentHandler(bestAttemptContent)
        }

, и это словарь, отправленный дляУведомление:

let postParams: [String : Any] = [
            "to": topic,
            "notification": [
                //                    "badge" : 1, sendig the badge number, will cause aglitch
                "body": body,
                "title": title,
                "subtitle": subtitle,
                "text": "some text",
                "sound" : true, // or specify audio name to play
                "priority": "high",
                "content_available": true,
                "mutable_content": true,
                "category": "shop-promotions"
            ],
            "data" : [
                "attachment-url": dataUrl,
//                "media_type":"image",
                "productId": productId,
                "price": price
            ]
        ]

ОБНОВЛЕНИЯ:

  1. Изменены объявления категорий, помещая их в статическую функцию, которую я вызываю в didFinishLaunchingWithOptions после проверки разрешения уведомления и didRegisterForRemoteNotificationsWithDeviceToken после получениятокен.
  2. Установите NotificationService info.plist без каких-либо UNNotificationExtensionCategory, так как я увидел, что это в NotificationContent info.plist.
  3. Пробовал разные Target Membership настройкидля NotificationService.swift и info.plist.Какая конфигурация правильная?

По-прежнему в той же ситуации только изображение, отображаемое с уведомлением.

Вы видите, чего не хватает для правильной настройки?

Функция действий такова:

static func configurePushCategories() {
        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.badge,.sound]) { (granted:Bool, error:Error?) in
                if error != nil {
                    print(error?.localizedDescription as Any)
                }
                if granted {
                    print("Permission granted")
                } else {
                    print("Permission not granted")
                }
            }

            //  actions

            let buy = UNNotificationAction(identifier: "buy", title: "Buy", options: [.foreground])
            let play = UNNotificationAction(identifier: "play", title: "Play", options: [.foreground])
            let close = UNNotificationAction(identifier: "close", title: "Close", options: [.foreground])

//            let shopPromotionsCategory = UNNotificationCategory(identifier: "shop-promotions", actions: [buy,close], intentIdentifiers: ["buy","close"], options: [])
//            let fixItPromotionsCategory = UNNotificationCategory(identifier: "fix-it-promotions", actions: [buy,close], intentIdentifiers: ["buy","close"], options: [])
//            let cityFixItNewsCategory  = UNNotificationCategory(identifier: "city-fix-it-news", actions: [play,close], intentIdentifiers: ["play","close"], options: [])
//            let countryFixItNewsCategory = UNNotificationCategory(identifier: "country-fix-it-news", actions: [play,close], intentIdentifiers: ["play","close"], options: [])

            let shopPromotionsCategory = UNNotificationCategory(identifier: "shop-promotions", actions: [buy,close], intentIdentifiers: [], options: [])

            let fixItPromotionsCategory = UNNotificationCategory(identifier: "fix-it-promotions", actions: [buy,close], intentIdentifiers: [], options: [])

            let cityFixItNewsCategory  = UNNotificationCategory(identifier: "city-fix-it-news", actions: [play,close], intentIdentifiers: [], options: [])

            let countryFixItNewsCategory = UNNotificationCategory(identifier: "country-fix-it-news", actions: [play,close], intentIdentifiers: [], options: [])

            UNUserNotificationCenter.current().setNotificationCategories([shopPromotionsCategory,fixItPromotionsCategory, cityFixItNewsCategory, countryFixItNewsCategory])
        } else {
            // Fallback on earlier versions
        }
    }

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Наконец-то обнаружена причина, по которой действия не отображаются после всех изменений. В словаре "category": "someValue" должно быть объявлено как "click_action":"someValue" .. как оно относится к Firebase ... не уверен, что я согласен с этим выбором ... возможно, это просто для того, чтобы оживить то, что было бы иначе скучным существованием для разработчиков ... спасибо Firebase .. Помимо сарказма большое спасибо за помощь в этом тоже.

0 голосов
/ 13 июня 2019

В документации Apple говорится:

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

Уведомление Полезная нагрузка:

{
   “aps” : {
      “category” : “MEETING_INVITATION”
      “alert” : {
         “title” : “Weekly Staff Meeting”
         “body” : “Every Tuesday at 2pm”
      },
   },
   “MEETING_ID” : “123456789”,
   “USER_ID” : “ABCD1234”

} 

Для поддержки активных уведомлений необходимо:

  • Объявление одной или нескольких категорий уведомлений во время запуска из приложения iOS.

  • Назначьте соответствующие действия вашим категориям уведомлений.

  • Обработка всех действий, которые вы зарегистрировали.

  • Назначение идентификаторов категории для полезных нагрузок уведомлений при генерации уведомлений.

...