带 Firebase 主题消息的 iOS 推送通知未发送至设备

Spe*_*son 3 push-notification node.js ios firebase firebase-cloud-messaging

我正在尝试使用 node.js 将 iOS 推送通知发送到 Firebase 中的主题。我按照本教程进行操作,但无法弄清楚为什么通知没有发送到订阅该主题的设备。我能够从控制台发送主题消息并成功listenForNotificationRequests()删除notificationRequest子项。

以下是 Firebase 中通知请求的结构:

通知请求示例

这是删除了键/url 的 node.js 代码:

var firebase = require('firebase-admin');
var request = require('request');

var API_KEY = "APIKEYREMOVED"; // Your Firebase Cloud Messaging Server API key

// Fetch the service account key JSON file contents
var serviceAccount = require("./pathToJSON");

// Initialize the app with a service account, granting admin privileges
firebase.initializeApp({
  credential: firebase.credential.cert(serviceAccount),
  databaseURL: "URL_REMOVED"
});
ref = firebase.database().ref();

function listenForNotificationRequests() {
  var requests = ref.child("notificationRequests");
  requests.on("child_added", function(requestSnapshot) {
    var request = requestSnapshot.val();
    sendNotificationToUser(
      request.username,
      request.message,
      function() {
        requestSnapshot.ref.remove();
      }
    );
  }, function(error) {
    console.error(error);
  });
};

function sendNotificationToUser(username, message, onSuccess) {
  request({
    url: "https://fcm.googleapis.com/fcm/send",
    method: "POST",
    headers: {
      "Content-Type" : "application/json",
      "Authorization": "key="+API_KEY
    },
    body: JSON.stringify({
      to : "/topics/user_"+username,
      priority : "high",
      notification: {
        title: message
      }
    })
  }, function(error, response, body) {
    if (error) { console.error(error); }
    else if (response.statusCode >= 400) { 
      console.error('HTTP Error: '+response.statusCode+' - '+response.statusMessage); 
    }
    else {
      onSuccess();
    }
  });
}

// start listening
listenForNotificationRequests();
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助/建议!

编辑:

以下是我在 Swift 中订阅主题的方式:

var firebase = require('firebase-admin');
var request = require('request');

var API_KEY = "APIKEYREMOVED"; // Your Firebase Cloud Messaging Server API key

// Fetch the service account key JSON file contents
var serviceAccount = require("./pathToJSON");

// Initialize the app with a service account, granting admin privileges
firebase.initializeApp({
  credential: firebase.credential.cert(serviceAccount),
  databaseURL: "URL_REMOVED"
});
ref = firebase.database().ref();

function listenForNotificationRequests() {
  var requests = ref.child("notificationRequests");
  requests.on("child_added", function(requestSnapshot) {
    var request = requestSnapshot.val();
    sendNotificationToUser(
      request.username,
      request.message,
      function() {
        requestSnapshot.ref.remove();
      }
    );
  }, function(error) {
    console.error(error);
  });
};

function sendNotificationToUser(username, message, onSuccess) {
  request({
    url: "https://fcm.googleapis.com/fcm/send",
    method: "POST",
    headers: {
      "Content-Type" : "application/json",
      "Authorization": "key="+API_KEY
    },
    body: JSON.stringify({
      to : "/topics/user_"+username,
      priority : "high",
      notification: {
        title: message
      }
    })
  }, function(error, response, body) {
    if (error) { console.error(error); }
    else if (response.statusCode >= 400) { 
      console.error('HTTP Error: '+response.statusCode+' - '+response.statusMessage); 
    }
    else {
      onSuccess();
    }
  });
}

// start listening
listenForNotificationRequests();
Run Code Online (Sandbox Code Playgroud)

Spe*_*son 5

对于任何遇到此问题的人,我都发现了这个问题。我必须将“文本”添加到通知有效负载中,以填充通知正文。本教程仅包含“标题”,它是可选的,并且其本身还不够......至少对于我所读到的 APNS 来说是这样。

感谢那些回答的人!

function sendNotificationToUser(username, message, onSuccess) {
  request({
    url: "https://fcm.googleapis.com/fcm/send",
    method: "POST",
    headers: {
      "Content-Type" : "application/json",
      "Authorization": "key="+API_KEY
    },
    body: JSON.stringify({
      "priority" : "high",
      "notification" : {
        "title": sender,
        "text": message
      },
      "to" : "/topics/user_"+username
    })
  }, function(error, response, body) {
    if (error) { console.error(error); }
    else if (response.statusCode >= 400) { 
      console.error('HTTP Error: '+response.statusCode+' - '+response.statusMessage); 
    }
    else {
      onSuccess();
    }
  });
}
Run Code Online (Sandbox Code Playgroud)