我们目前有一个解决方案,可以将推送通知从FCM发送到APNS,然后再发送到iOS。由于引入了 iOS13,APNS 现在要求在任何传入有效负载中使用 apns-push 类型,以指定它是警报通知、后台通知还是任何其他类型。我想知道如何在发送给 FCM 的消息中添加此信息。
目前我们使用pyFCM向FCM发送消息。我们遵循此页面作为参考:https://firebase.google.com/docs/cloud-messaging/http-server-ref
from pyfcm import FCMNotification
push_service = FCMNotification(api_key="XXXX")
registration_id = '<Token>'
data_message = {
"Score": "3*1",
"DeviceId": "XXXXXX",
}
# Background notification
result = push_service.notify_single_device(registration_id=registration_id,
content_available=True,
data_message=data_message)
# Alert notification
result = push_service.notify_single_device(registration_id=registration_id,
message_title='Sample title',
message_body='Sample body',
data_message=data_message,
)
这适用于现有的iOS应用程序。但是对于 iOS 13,我找不到任何地方来指定 apns-push-type,或者 FCM 将转换为将发送到 APNS 的 apns-push-type 的任何等效字段。
我知道iOS 13相对较新,所以每个人都在努力调整现有的解决方案。希望有人能给我一些见解,如何将 apns 推送类型放入我现有的解决方案中。谢谢。
只需在要发送到 FCM 的请求标头中添加 'apns-push-type' = 'XXX'
您可以使用通知的"extra_kwargs"添加此选项。
添加extra_kwargs={"apns_push_type":"background"}用于后台通知。
# Background notification
result = push_service.notify_single_device(registration_id=registration_id,
content_available=True,
data_message=data_message,
low_priority=True,
extra_kwargs={"apns_push_type": "background"})
此外,将后台通知的优先级标记为低。这是通过将low_priority发送为真来完成的。
对于警报通知,我们需要将 apns 推送类型作为"警报"发送
# Alert notification
result = push_service.notify_single_device(registration_id=registration_id,
message_title='Sample title',
message_body='Sample body',
data_message=data_message,
extra_kwargs={"apns_push_type": "alert"}
)
您可以检查推送通知是否有效 JSON API 向https://fcm.googleapis.com/fcm/send
URL 发布请求。 在"配置标头"中Content-Type : application/json
和Authorization:key=<Your FCm server key>
然后在请求正文中添加这些
{ "to" : "device_token",
"notification" :
{
"title": "message title!",
"body": "MESSAGE BODY",
"token": "XXXXXXXXXX",
"id": 1959,
"sound": "default"
},
"apns": {
"headers": {
"apns-push-type": "alert"
}
}
}
然后,您可以检查它是否有效。 我的项目在更新IOS 13之前一直在工作。 更新后,通知在后台不起作用, 添加
"apns": {
"headers": {
"apns-push-type": "alert"
}
}
到项目使接收通知成为可能
我们的解决方案是根据请求将其添加到标头中(此答案在PHP代码上(
$headers = [
'Authorization: key=' . $serverKey,
'Content-Type: application/json',
'apns-push-type: background'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $fcmEndpoint);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, CURL_IPRESOLVE_V4);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payloads));
$result = json_decode(curl_exec($ch), true); curl_close($ch);