我构建了一个支持推送通知的应用。我试图找出当我收到推送通知时如何唤醒我的应用程序,以便我可以启动下载过程来更新我的应用程序数据。我遇到的问题是,当应用程序在后台时它没有收到didReceiveRemoteNotification
,即使设备上显示了推送通知,并且我确实在aps有效负载中包含了content-available
属性。请参阅下面的相关代码示例。
Xcode中我的功能选项卡的屏幕截图。
请注意我也尝试启用后台提取,但这没有任何不同。
以下是我注册远程通知的方法
let rejectAction = UNNotificationAction(identifier: "reject", title: "Reject", options: [.destructive])
let acceptAction = UNNotificationAction(identifier: "accept", title: "Accept", options: [.foreground])
let actionCategory = UNNotificationCategory(identifier: "ACTIONABLE", actions: [rejectAction, acceptAction], intentIdentifiers: [rejectAction.identifier, acceptAction.identifier], options: [.allowInCarPlay])
let center = UNUserNotificationCenter.current()
center.setNotificationCategories([actionCategory])
center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
// Enable or disable features based on authorization.
}
UIApplication.shared.registerForRemoteNotifications()
以下是我如何回复远程通知
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
NSLog("** [VoiceAppLog] Push Notification Received - didReceiveRemoteNotification **");
do {
let json = try JSONSerialization.data(withJSONObject: userInfo, options: .prettyPrinted)
let str = NSString(data: json, encoding: String.Encoding.utf8.rawValue)
NSLog("[VoiceAppLog] userInfo: \(String(describing: str))")
} catch {
}
// Make API calls here
completionHandler(.newData)
}
以下是我发送的内容有效负载的示例,只需稍加修改即可识别我正在处理的产品。
{ “my_category”:1, “custom_attribute_boolean”:false, “aps”:{ “content-available”:1, “警告”:“测试消息”, “徽章”:1, “声音”:“custom_sound.caf” } }
正如您所看到的,我可以告诉我根据文档做的一切都是正确的。有趣的是,当我将应用程序连接到我的调试器并将应用程序放在后台时,会正确调用didReceiveRemoteNotification
。但是,一旦断开调试器,就不再调用它。即使我重新打开应用程序并在不强制退出应用程序的情况下对其进行背景,也会发生这种情通过TestFlight进行生产构建也是如此。只要应用程序进入后台,就不再调用didReceiveRemoteNotification
协议方法。
我很好奇,如果我遇到了here解释的iOS错误。您是否有任何人在互联网上有任何想法如何解决/解决这个问题?
谢谢!
答案 0 :(得分:0)
我解决此问题的方法是使用VoIP推送通知,然后在我的应用程序委托中对其进行响应并更新内容。 VoIP推送通知将始终唤醒应用程序,而不管其状态如何。我知道不一定是VoIP通知的正确用法,但是它可以工作:)