不要显示基于自定义数据的远程通知
我想给用户启用/禁用某些类型的通知的选项。例如,打开私人邮件的推送通知,但关闭公共帖子。我想知道是否可以在接收到APN(在didReceiveRemoteNotification中)后在客户端执行此操作,我不确定在调用didReceiveRemoteNotification之前是否已经显示通知。不要显示基于自定义数据的远程通知
目前我正在使用OneSign发送推送通知,并且正在使用content-available true(1)发送它们。这会在应用程序处于后台时正确触发didReceiveRemoteNotification。根据我发送的数据,我想显示或不显示任何横幅推送通知。
这是我迄今为止尝试,我能得到我所需要的数据,但我一直无法弄清楚如何告诉的iDevice不显示它在所有:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("****this happened****")
print("\(userInfo)")
if let customData = userInfo["custom"] as? [String: Any] {
if let additionalData = customData["a"] as? [String: Any] {
if let notificationType = additionalData["notification_type"] as? String {
if notificationType == "follow" {
print("do not want to display")
if var apsData = userInfo["aps"] as? [String: Any] {
apsData.removeValue(forKey: "content-available")
}
} else {
print("dispaying this notification")
}
}
}
}
}
我想过的另一种方式是将用户的通知设置存储到我的数据库中,以及当用户发送推送通知以检查他们是否应该发送推送时。我只想看看是否可以在不添加更多数据库查询的情况下解决这个问题。
编辑:我也用OneSignal.initWithLaunchOptions,发现这个被didReceiveRemoteNotification在handleNotificationReceived之前,我想知道是否有可能停在这里的推送通知
if receivedNotification?.payload != nil {
if receivedNotification?.payload.additionalData != nil {
if let data = receivedNotification?.payload.additionalData["notification_type"] as? String {
if data == "follow" {
print("do not display this")
}
}
}
}
相反,我建议你的服务器上过滤称为因为向所有设备发送通知(只是为了省略它们而不被显示)具有下面的侧面:额外的电池消耗和content-available
通知不起作用,当用户划掉应用程序。
您可以使用mutable-content
来代替UNNotificationServiceExtension
,但这只适用于iOS 10,您仍然需要考虑电池。
您可以通过拨打IdsAvailable来获得设备的OneSignal播放器ID,您可以在此将其存储在您的后端。然后,您可以在create notification REST API call上使用include_player_ids
仅定位应接收通知的用户。
我有一种感觉,这可能是我不得不采取的解决方案,我希望Apple或OneSignal iOS SDK具有类似于Android的NotificationExtenderService的功能,那么我就必须以这种方式实现它!谢谢! – Hellojeffy
@Hellojeffy我为第二个选项添加了“mutable-content”。即使在Android上有'NotificationExtenderService',仍然推荐使用像iOS这样的'include_player_ids',因为这样可以防止设备在第一时间被唤醒并保存在用户的电池上。 – jkasten