Я внедряю 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
]
]
ОБНОВЛЕНИЯ:
- Изменены объявления категорий, помещая их в статическую функцию, которую я вызываю в
didFinishLaunchingWithOptions
после проверки разрешения уведомления и didRegisterForRemoteNotificationsWithDeviceToken
после получениятокен. - Установите
NotificationService
info.plist
без каких-либо UNNotificationExtensionCategory
, так как я увидел, что это в NotificationContent
info.plist
. - Пробовал разные
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
}
}