IOSのサイレント通知に問題があります。
アプリケーションがバックグラウンドにあるとき、FCMから送信されるサイレント通知を受信しません。ただし、APNSに直接送信しようとすると、通知は正常に受信されます。
これはFCMに送信されるJSONです。
{
"to" : "<token>",
"priority": "high",
"content_available": true,
"data" : {
"<key>" : "<string>",
"<key2>" : "<string>"
}
}
これは、APNSに直接送信されるJSONです。
{
"aps": {
"content-available": 1
},
"<key>": "<string>",
"<key>": "<string>"
}
「content_available」がすでに設定されている場合、優先度を設定するべきではないと言っている人がいるので、「priority」キーを削除しようとしました。うまくいきませんでした。
"notification"キーと値のペアを削除し、追加 "content_available":true
このようになります
{
"to" : "...",
"priority": "high",
"content_available": true,
"data" : {
....
}
}
これにより、サイレントAPNSになり、対応するAPNSデリゲートメソッドで処理する必要があります。
デリゲートを介してこれを処理する必要があります。詳細については、このfirebaseのドキュメントを参照してください。 https://firebase.google.com/docs/cloud-messaging/concept-options
回避策を見つけました。 「通知」フィールドに「サウンド」に空の値を入力すると、アプリケーションがバックグラウンドにある場合でもサイレント通知が配信されます。
{
"to" : "...",
"priority": "high",
"notification": {
"sound": ""
},
"data" : {
....
}
}
私の予感はAppleは '高'優先度のサイレント通知を許可せず、何らかの方法で "通知":{"サウンド": ""}はこの通知がサイレント通知ではないことをAPNSにだます。
私はnodejsを使用してFirebaseサイレントプッシュ通知に取り組んでいました。以下のコードを試してみたところ、うまくいきました。 "priority": "high"および "content_available":trueを追加すると、以下のエラーが発生しました。
コードの下で働いた
const admin = require('firebase-admin');
const serviceAccount ="...."; //service account path
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
let fcmToken = "...."; // Your token
let message ={
"token": fcmToken,
"data": {
"updateApi": "activity"
}
}
admin.messaging().send(message)
.then((response) =>{
console.log('Successfully sent notification:', response);
})
.catch((error) =>{
console.log('Error while sending notification:', error);
});
メッセージオブジェクトにpriorityおよびcontent_availableを追加するとエラーが発生する
{ code: 'messaging/invalid-argument',
message: 'Invalid JSON payload received. Unknown name "priority" at \'message\': Cannot find field.\nInvalid JSON payload received. Unknown name "content_available" at \'message\': Cannot find field.' },
codePrefix: 'messaging' }