使用 PhoneGap 和 Firebase 云消息传递 (FCM) 的简单推送通知 Android 应用程序

Posted

技术标签:

【中文标题】使用 PhoneGap 和 Firebase 云消息传递 (FCM) 的简单推送通知 Android 应用程序【英文标题】:Simple Push Notification Android App Using PhoneGap With Firebase Cloud Messaging (FCM) 【发布时间】:2020-12-18 08:14:00 【问题描述】:

使用 FCM 的推送通知如何工作?

看看下面的图片,我通过互联网来解释自己,这是不言自明的。首先,您需要在 Google 服务 (FCM) 中注册您的客户端 android 手机/应用程序,您将获得您的唯一 ID 作为回报,您将发送您自己的主服务器进行保存。因此,每次您要将某些内容推送到安装了您的应用程序的 android 设备时,您的 Web 界面都需要它已经拥有的每部手机的手机/应用程序唯一 ID,以便您的服务器将通知推送到 Google 服务 (FCM)使用目标手机/应用程序的唯一 ID,Google(无论如何)都会将通知发送到该手机,即使它没有在前面运行您的应用程序,他们也会收到通知。

我的问题/问题?

我尝试使用具有以下文件/文件夹级别的 Adob​​e PhoneGap Desktop 制作一个简单的应用程序。

> My Project/
  > platforms/
    > browser/
    > platforms.json
  > plugins/
    > cordova-plugin-fcm/
    > cordova-plugin-whitelist/
    > browser.json
    > fetch.json
  > www/
    > res/
      > icon/
      > screen/
    > index.html
  > config.xml
  > google-services.json

尝试的其他插件:

    cordova-plugin-fcm cordova-plugin-firebase cordova-plugin-push-notification

话不多说,在这里跟大家分享一下我的重要文件。

config.xml

<?xml version='1.0' encoding='utf-8'?>
<widget id="net.exeideas.app" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0">
    <name>EXEIdeas Push Notification</name>
    <description>
        A Basic Adobe PhoneGap For Push Notification Via php And Firebase Cloud Messaging.
    </description>
    <author email="info@exeideas.net" href="httpd://www.exeideas.net">
        PhoneGap Team
    </author>
    <content src="index.html" />
    <preference name="android-minSdkVersion" value="14" />
    <plugin name="cordova-plugin-whitelist" source="npm" spec="~1.2.1" />
    <plugin name="cordova-plugin-fcm" source="npm" spec="~2.1.2" />
    <platform name="android">
        <icon src="www/res/icon/android/fcm_push_icon.png" />
        <icon density="ldpi" src="www/res/icon/android/drawable-ldpi-icon.png" />
        <icon density="mdpi" src="www/res/icon/android/drawable-mdpi-icon.png" />
        <icon density="hdpi" src="www/res/icon/android/drawable-hdpi-icon.png" />
        <icon density="xhdpi" src="www/res/icon/android/drawable-xhdpi-icon.png" />
        <icon density="xxhdpi" src="www/res/icon/android/drawable-xxhdpi-icon.png" />
        <icon density="xxxhdpi" src="www/res/icon/android/drawable-xxxhdpi-icon.png" />
        <splash density="land-ldpi" src="www/res/screen/android/drawable-land-ldpi-screen.png" />
        <splash density="land-mdpi" src="www/res/screen/android/drawable-land-mdpi-screen.png" />
        <splash density="land-hdpi" src="www/res/screen/android/drawable-land-hdpi-screen.png" />
        <splash density="land-xhdpi" src="www/res/screen/android/drawable-land-xhdpi-screen.png" />
        <splash density="land-xxhdpi" src="www/res/screen/android/drawable-land-xxhdpi-screen.png" />
        <splash density="land-xxxhdpi" src="www/res/screen/android/drawable-land-xxxhdpi-screen.png" />
        <splash density="port-ldpi" src="www/res/screen/android/drawable-port-ldpi-screen.png" />
        <splash density="port-mdpi" src="www/res/screen/android/drawable-port-mdpi-screen.png" />
        <splash density="port-hdpi" src="www/res/screen/android/drawable-port-hdpi-screen.png" />
        <splash density="port-xhdpi" src="www/res/screen/android/drawable-port-xhdpi-screen.png" />
        <splash density="port-xxhdpi" src="www/res/screen/android/drawable-port-xxhdpi-screen.png" />
        <splash density="port-xxxhdpi" src="www/res/screen/android/drawable-port-xxxhdpi-screen.png" />
    </platform>
    <access origin="*" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <platform name="android">
        <allow-intent href="market:*" />
    </platform>
</widget>

index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
        <title>EXEIdeas Push Notofocation</title>
        <script type="text/javascript">
            document.addEventListener("deviceready", onDeviceReady, false);
    
            function onDeviceReady() 
                var push = PushNotification.init( "android": "senderID": "my sender id");
                push.on('registration', function(data) 
                    console.log(data.registrationId);
                );
    
                push.on('notification', function(data) 
                    console.log(data.title + " Message: " + data.message);
                );
    
                push.on('error', function(e) 
                    console.log(e);
                );
            
        </script>
    </head>
    <body>
        <h1>EXEIdeas Push Notification Example</h1>
        <script type="text/javascript">
            FCMPlugin.getToken(function(token) 
                //this is the FCM token which can be used
                //to send notification to specific device 
                alert(token);
                FCMPlugin.onNotification( onNotificationCallback(data), successCallback(msg), errorCallback(err) )
                //Here you define your application behaviour based on the notification data.
                FCMPlugin.onNotification(function(data) 
                    alert(data);
                    //data.wasTapped == true means in Background :  Notification was received on device tray and tapped by the user.
                    //data.wasTapped == false means in foreground :  Notification was received in foreground. Maybe the user needs to be notified.
                     if (data.wasTapped) 
                         //Notification was received on device tray and tapped by the user.
                         alert(JSON.stringify(data));
                      else 
                         //Notification was received in foreground. Maybe the user needs to be notified.
                         alert(JSON.stringify(data));
                     
                );
            );
            
            //FCMPlugin.onTokenRefresh( onTokenRefreshCallback(token) );
            //Note that this callback will be fired every time a new token is generated, including the first time.
            FCMPlugin.onTokenRefresh(function(token)
                alert( token );
            );
        </script>
    </body>
</html>

并通过 Adob​​e PhoneGap Desktop 直接在我的 Android 中运行此代码,如下面的屏幕截图所示。另外,我使用的是&lt;preference name="android-minSdkVersion" value="14" /&gt; android SDK 版本,您可以根据需要进行更改。

完成所有上面的事情后,我使用cordova-plugin-fcm tester 发送测试通知,但没有收到它,也没有在任何地方看到任何错误。提到的链接警报Push notification sent successfully!

那么任何人都可以弄清楚我在哪里做错了,因为我没有在 Apps Desktop POPUP 中获得设备 ID,就像在 index.html 页面上写的那样?在一些博客上,我读到推送通知无法在 Adob​​e PhoneGap 桌面本地主机上运行,​​因此我必须构建最终的 APK 进行测试,但我还没有这样做。另外,如果您认为我在 FCM 设置中犯了任何错误,那么您也可以提及这些步骤,我会再做一次。

注意:本网站中有很多问题看起来像这样,但由于 Cordova、Android、FCM 等方面的更新,它们已经过时,所以请不要在此处提及任何旧答案。

【问题讨论】:

【参考方案1】:

我有同样的问题,firebase 通知推送不再适用于使用 JavaScript(ionic、cordova、phonegap,...)的混合移动应用程序

我建议你使用 Android Native 应用程序(Java 或 Kotlin)

【讨论】:

以上是关于使用 PhoneGap 和 Firebase 云消息传递 (FCM) 的简单推送通知 Android 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

用于 Phonegap/Cordova 应用程序的 Firebase 分析

为啥 Firebase 在 Android 模拟器上运行时在 PhoneGap 应用程序中返回 404 错误?

当应用程序打开或应用程序处于后台时,Phonegap Firebase 推送通知不会触发事件侦听器

Firebase 推送通知与 PhoneGap Build 使用 cordova-plugin-fcm

在Phonegap中推送通知?

phonegap-plugin-push设置启动