在 Web 服务器上实现 Firebase 云消息传递。

3

我有一个运行网站的服务器。我需要这个服务器能够向三个独立的设备组(Android,iOS和客户端Web应用程序)进行管理(仅下行)通知。

我尝试使用Firebase云消息传递。使用FCM,我计划使用http协议发送json消息。

除此之外,我对该怎么做感到困惑。我知道GCM教程应该基本与FCM教程相同,但我很难找到一篇可以让我弄清楚自己需要做什么的教程,因为每篇教程似乎都混淆了服务器和客户端应用程序,这让我很困惑。

我已经仔细阅读了https://firebase.google.com/docs/cloud-messaging/server#choose,但它似乎忽略了我还没有的一些必备知识。有人能建议一个好的起点来实现我想要的FCM吗?我整体上对Web开发非常陌生,不到两个月时间(使用node、mongo和scss),并且对如何开始FCM感到有些不知所措。

非常感谢您提供的任何反馈。


你似乎对基础知识有很好的掌握。不幸的是,在Stack Overflow上推荐离线资源是不相关的话题。话虽如此,这个答案展示了如何使用node.js脚本发送消息。 - Frank van Puffelen
那是一个相当不错的链接,看起来就像我正在寻找的东西。哎呀,我在这个社区已经待了足够长的时间,应该知道得更好。感谢您的反馈!这个网站还有其他部分或者其他社区更适合那种类型的问题吗? - Liquidmetal
我对您认为在文档中被忽略的具体内容很感兴趣。您能给出一些例子吗? - Arthur Thompson
你好,我已经使用PHP在服务器端完成了这个。如果对你有帮助的话,我可以分享一下? - Pritish Joshi
@ArthurThompson,一旦我弄清楚了我在做什么,我会告诉你我缺少了什么。 - Liquidmetal
@devqualwebs 非常感谢!我正在使用 JavaScript,但任何示例都会有所帮助! - Liquidmetal
1个回答

8
您写道,您计划在Android、iOS和客户端Web应用程序三个平台上接收通知。您可以使用Firebase获取实时通知或所需数据,但是请记住,与其他平台相比,每个平台的实现过程略有不同。首先,您必须选择其中一个并开始实施。让我们从头开始...
将Firebase集成到应用程序中的常见过程是在https://console.firebase.google.com/上创建项目。
创建项目后,您将能够看到Firebase密钥,该密钥将在您的应用程序中使用。您可以在https://console.firebase.google.com/project/project-[your_project_number]/overview上查看此内容。
我希望您已经完成了这一步骤,但不要忘记在https://console.firebase.google.com/project/project-[your_project_number]/database/ruleshttps://console.firebase.google.com/project/project-[your_project_number]/storage/rules上为数据库和存储授予权限。
对于数据库,只需离开它即可...
{
  "rules": {
    ".read": true,
    ".write": true
  }
}

对于存储,只需离开这个...

service firebase.storage {
  match /b/project-[your_project_number].appspot.com/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

这将定义您可以公开使用它,无需在Firebase端进行任何验证。如果您想添加任何类型的验证,您可以通过https://console.firebase.google.com/project/project-[your_project_number]/authentication/providers进行。

现在开始介绍从服务器到Web应用程序的通知。首先,我想让您知道FCM(Firebase云消息传递)仅可在Android、iOS和Web(指定Google Chrome)上实现。因此,为了在所有浏览器上使用它,我们必须实现Firebase数据库。在js方面,您必须像概述中看到的那样放置一些东西。

<script src="https://www.gstatic.com/firebasejs/3.1.0/firebase.js"></script>
<script>
  // Initialize Firebase
  var config = {
    apiKey: "your_api_key",
    authDomain: "project-[your_project_number].firebaseapp.com",
    databaseURL: "https://project-[your_project_number].firebaseio.com",
    storageBucket: "project-[your_project_number].appspot.com",
  };
  firebase.initializeApp(config);
</script>

在服务器端触发事件或通知,您可以使用CURL。由于您提到正在使用Node.js,因此可以使用https://firebase.google.com/docs/server/setup#add_firebase_to_your_app来帮助您。我已经通过在PHP中应用CodeIgniter的服务器端CURL实现了它。以下是代码示例。您可以在https://firebase.google.com/docs/database/rest/save-data#section-put中查看CURL示例。
<?php 
if (!defined('BASEPATH')) exit('No direct script access allowed');

//PHP CURL FOR NOTIFICATION
function booking_notification($notif_arr, $notif_type)
{
    //GET CI 
    $CI =& get_instance();

    $url = 'put_your_firebase_database_url_here';
    $key = 'put_firebase_key';
    $notif_arr = {'Key':'values'};//THIS IS THE DATA WHAT YOU WILL NEED TO SHOW ON FRONT END TO NOTIFY
    $notif_type = 'notification'; //THIS IS THE NAME JSON WHICH WILL BE CREATED IF NOT EXIST AT FIREBASE DATABASE
    $headers = array(
       'Authorization: key=' . $key,
       'Content-Type: application/json'
   );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url."/".$notif_type.".json");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

   // Disabling SSL Certificate support temporarly
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

   curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($notif_arr));

   // Execute post
   $result = curl_exec($ch);

   if ($result === FALSE) {
       die('Curl failed: ' . curl_error($ch));
       // Close connection
       curl_close($ch);

       return FALSE;
   }
   else
   {
       // Close connection
       curl_close($ch);
       return TRUE;
   }
}

现在让我们看看如何从服务器端获取通知。
JavaScript
var fireBaseJSONref = firebase.database().ref().child("notification"); //BY THIS YOU CAN GET THE JSON OF FIREBASE DATABASE
fireBaseJSONref.on('child_added', function(snapshot) {
        if (!ignoreItems) {
            console.log(snapshot.val());//THIS WILL PRINT THE DATA WHAT YOU HAVE TRIGGERD FROM SERVER
        }
});
/* WHEN FIRST TIME ANY DATA SENT TO DATABASE OF FIREBASE AFTER PAGE LOAD */


fireBaseJSONref.once('value', function(snapshot) {ignoreItems = false}); //THIS WILL HELP YOU TO NOT TO CALL FOR PREVIOUSLY ADDED ITEM IN FIREBASE DATABASE. WHEN NEW DATA WILL BE ONLY THEN IT WILL CALL.

这将帮助您找出困惑的地方。如果这对您有用,请告诉我,我还会为Android和iOS进行改进。


哇,这解释真是太好了。我会仔细研究它,并告诉你结果的。 - Liquidmetal
所以在你的PHP代码中,你使用了一个主要由curl请求组成的php函数,这对我来说很有意义。我不确定的是php代码如何产生通知。从我看到的内容来看,要使用cURL发送GCM通知,您需要包含类似于https://android.googleapis.com/gcm/send的内容。您提供的示例只是一些cURL内容的示例(不一定是通知),还是我缺少一些基本的东西?我也看不到php如何选择哪个用户接收通知,除非它在键值对中...真的非常感谢您的所有帮助! - Liquidmetal
是的,你说得对。我想再次引起你的注意,这不是FCM。这是Firebase数据库实现,用于获取Web应用程序上的实时数据。由你决定如何在其中执行操作。它不像推送通知那样工作。我已经创建了一个聊天应用程序,并通过实现它来获得实时通知。如果我有时间,我会包括Android推送通知过程。 - Pritish Joshi
很高兴看到这个。这意味着您能够在浏览器上获取实时数据,我希望您也已经开始尝试移动设备上的推送通知了。 - Pritish Joshi
你好。我们能否获取CodeIgniter FCM推送通知的完整演示? - Devsi Odedra
嗨@PritishJoshi - 我正在尝试通过FCM实现Web推送,但由于它不适用于IE,我正在尝试看看是否可以使用此Firebase数据库实现相同的功能。您能否告诉我您是否在IE中尝试过这个并且它有效?此外,您是否有一个Java实现php代码的后端服务器更新数据库的版本?我计划在IE客户端上创建Firebase数据库(因为FCM适用于Chrome / Firefox),并从后端代码更新数据库。因此,它将触发Firebase数据库上的更改,通过它我只需触发通知即可。 - csharpnewbie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接