当我的 iOS 应用程序处于后台或睡眠模式时,我无法显示推送通知。通知在前台运行良好,但根本不会显示在后台。我已多次验证我的设置,包括通知权限、负载格式和后台模式,但问题仍然存在。
我尝试过的: APNs Payload:后端将以下有效负载发送到APNs:
{
"mediaDomain": "your_domain",
"sendTime": "1633024800",
"chatData": "chat_data_here",
"time": "1633024800",
"uuid": "unique_id",
"senderPublicKey": "public_key",
"receiverPublicKeyIdentifier": "receiver_id",
"senderPublicKeyIdentifier": "sender_id",
"version": "1",
"chatID": "12345",
"senderID": "67890",
"receiverID": "54321",
"isRetain": "false",
"type": "chat_message",
"aps": {
"alert": {
"title": "palphone",
"body": "You have one new message"
},
"sound": "default",
"content-available": 1
}
}
通知类型:chat_message。 我希望此有效负载显示带有警报和声音的通知,但当应用程序位于后台时它不起作用。 AppDelegate 设置: 我已经在 AppDelegate 中实现了处理推送通知所需的方法:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if let type = userInfo["type"] as? String, type == "chat_message" {
// Process notification
let content = UNMutableNotificationContent()
content.title = "New Message"
content.body = "Check your messages."
content.sound = .default
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}
completionHandler(.newData)
}
背景模式: 在签名和功能中启用远程通知后台模式。 通知权限: 我在 didFinishLaunchingWithOptions 中正确请求通知权限:
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
if granted {
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
} else {
print("Notification permission denied.")
}
}
真机测试: 我正在真实设备上进行测试,通知在后台不起作用,但当应用程序位于前台时它们会起作用。
我的期望: 当应用程序位于后台时,我希望收到带有警报和声音的可见通知,就像它位于前台时一样。
发生了什么: 当应用程序处于后台或睡眠状态时,不会显示任何通知。 didReceiveRemoteNotification 方法也没有被调用。
我的环境: Xcode 版本:16.0。 iOS版本:18.0 设备:iPhone 16 推送通知服务:Firebase/自定义 APN 实施
附加说明: 我检查了 APN 的日志,推送通知已成功发送到设备。它只是没有被显示。 content-available: 1 包含在负载中用于后台处理,但不会触发本地通知。
您的 APNS 有效负载错误。使用以下有效负载。
{
"mediaDomain": "your_domain",
"sendTime": "1633024800",
"chatData": "chat_data_here",
"time": "1633024800",
"uuid": "unique_id",
"senderPublicKey": "public_key",
"receiverPublicKeyIdentifier": "receiver_id",
"senderPublicKeyIdentifier": "sender_id",
"version": "1",
"chatID": "12345",
"senderID": "67890",
"receiverID": "54321",
"isRetain": "false",
"type": "chat_message",
"aps": {
"alert": {
"title": "palphone",
"body": "You have one new message"
},
"sound": "default"
}
}
问题是什么:
由于
"content-available": 1
,您的有效负载充当无声推送。
从有效负载中删除该密钥。