如何通过 CURL 向所有设备发送 Firebase 通知?

新手上路,请多包涵

我正在尝试向所有应用程序用户(在 Android 上)发送通知,基本上复制了通过 Firebase 管理控制台发送通知时发生的情况。这是我开始的 CURL 命令:

curl –insecure –header “授权:key=AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM” –header “Content-Type:application/json” -d “{\“notification\”:{\“title\”:\“note -Title\”,\“body\”:\“note-Body\”}}” https://fcm.googleapis.com/fcm/send

这是解析出来的 JSON,以便您更容易看到:

 {
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    }
}

返回的响应只有两个字符:

就是这样,“到”这个词。 (标题报告 400)我怀疑这与我的 JSON 中没有“to”有关。一个“到”甚至会放什么?我没有定义任何主题,设备也没有注册任何东西。然而,他们仍然能够接收来自 Firebase 管理面板的通知。

由于 Firebase 通知处理的惊人限制,我想尝试一个“仅数据”的 JSON 包,如果您的应用程序在前台,通知将由您的处理程序处理,但如果您的应用程序在后台,它会得到由 Firebase 服务在内部处理,并且从未传递给您的通知处理程序。显然,如果您通过 API 提交通知请求,则可以解决此问题,但前提是您仅使用数据执行此操作。 (这会破坏使用相同消息处理 iOS 和 Android 的能力。)在我的任何 JSON 中用“数据”替换“通知”都没有效果。

好的,然后我在这里尝试了解决方案: Firebase Java Server to send push notification to all devices 在我看来,“好的,即使可以通过管理控制台向所有人发送通知……通过 API 真的不可能。 “解决方法是让每个客户端订阅一个主题,然后将通知推送到该主题。所以首先是onCreate中的代码:

 FirebaseMessaging.getInstance().subscribeToTopic("allDevices");

然后我发送的新 JSON:

 {
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    },
"to":"allDevices"
}

所以现在我至少从服务器得到了真正的响应。 JSON响应:

 {
"multicast_id":463numbersnumbers42000,
"success":0,
"failure":1,
"canonical_ids":0,
"results":
    [
    {
    "error":"InvalidRegistration"
    }
    ]
}

这带有一个 HTTP 代码 200。好的……根据 https://firebase.google.com/docs/cloud-messaging/http-server-ref 一个带有“InvalidRegistration”的 200 代码意味着注册令牌有问题.也许?因为那部分文档是针对消息服务器的。通知服务器是否相同?不清楚。我在其他地方看到该主题可能需要几个小时才能激活。看起来这对于创建新的聊天室来说毫无用处,所以这似乎也很不对劲。

当我可以从头开始编写一个应用程序,并在几个小时内收到通知时,我感到非常兴奋,而我以前从未使用过 Firebase。在达到 Stripe.com 文档的水平之前,它似乎还有很长的路要走。

底线:有谁知道提供什么 JSON 来向所有运行应用程序的设备发送消息以反映管理控制台功能?

原文由 Anders8 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 575
2 个回答

这是一个 PHP Admin-SDK 示例,用于为用户订阅主题并通过设备令牌或主题向设备发送消息。请注意,主题是在您订阅用户时自动创建的。

 $testTokens = ['device token 1', 'device token 2', ....]

// CREDENTIALS, YOU HAVE TO DOWNLOAD IT FROM FIREBASE CONSOLE.
$factory = (new Factory())->withServiceAccount('credentials.json');

$messaging = $factory->createMessaging();

// Subscribe a token or a group of tokens to a topic (this topic is created automatically if not exists)
// YOU CAN DO THIS IN THE MOBILE APP BUT IS BETTER DO IT IN THE API.
$result = $messaging->subscribeToTopic('all', $testTokens); // 'all' is the topic name

// Send a message to a specific Topic (Channel)
$message = CloudMessage::withTarget('topic', 'all')
    ->withNotification(Notification::create('Global message Title', 'Global message Body'))
    ->withData(['key' => 'value']); // optional
$messaging->send($message);

// Send a message to a token or a grup of tokens (ONLY!!!)
 foreach($testTokens as $i=>$token){
     $message = CloudMessage::withTarget('token', $token)
         ->withNotification(Notification::create('This is the message Title', 'This is the message Body'))
         ->withData(['custom_index' => $i]); // optional
     $messaging->send($message);

您可以查看此存储库以获取更多详细信息: firebase-php-admin-sdk

原文由 manuelpgs 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题