android - 如何使用 Ionic 2 增加 Android 应用程序图标中的徽章计数通知?

标签 android cordova ionic-framework notifications ionic2

我使用 Ionic 2 开发了一个 Android 应用程序。 该应用程序运行良好,并且通知已正确发送到应用程序。 但是,我总是收到推送通知,但统计通知的图标徽章却不会出现。

我尝试了很多,在互联网上搜索了很多,但没有一个解决方案有效。

信息:

  1. 我安装了 cordova-plugin-badge
  2. 在我的 app.component.ts 中,我已经导入了 Badge 插件:import { Badge } from 'ionic-native';
  3. 为了测试,我将徽章计数设置为 10,并使用以下代码:Badge.set(10); - 我将此代码放入 constructor 中app.components.ts

我关注了Ionic tutorial使用徽章。

我尝试使用 plugin tutorial 进行开发,但它并不特定于 Ionic。然后,我不知道这有什么帮助。

我使用了Ionic 2 tutorial to do the push notifications而且,正如我所说,工作正常。

嗯,有关 Badge 的 Ionic 文档告知我必须使用 Badge.increase(x)。我不知道该把这段代码放在哪里。我想我必须指定:当通知到达设备时,然后 Badge.increase(x)。但是,我不知道该怎么做。

我的推送通知代码是:

this.push.register().then((t: PushToken) => {
  return this.push.saveToken(t);
}).then((t: PushToken) => {
  console.log('Token saved:', t.token);
});

this.push.rx.notification()
.subscribe((msg) => {
  alert(msg.title + ': ' + msg.text);
  Badge.clear();
});

但是此代码仅在应用程序打开时运行。 当我收到后台通知时,如何增加徽章?

另一个重要信息:

我使用 Android Studio 提供的 Android 模拟器来模拟 Android。 device specs .

在 Android 设备监视器中,我看到以下错误:

01-25 21:26:54.558: W/PackageManager(6769): Unknown permission com.sec.android.provider.badge.permission.READ in package com.ionicframework.myapp343731
01-25 21:26:54.558: W/PackageManager(6769): Unknown permission com.sec.android.provider.badge.permission.WRITE in package com.ionicframework.myapp343731

错误列表continues here .

尝试在 Google 中搜索此错误。结果很少。 Ionic 特有的零结果。太棒了,是吧?

而且...我在 Android 中看到徽章计数通知。 可以做到这一点。但是,怎么办?

抱歉我的英语和长文本。

谢谢!

编辑 1 --------------------

我的环境:

OS: Ubuntu 16.04.1 LTS
node -v: v5.12.0
npm -v: 3.8.6
ionic -v: 2.2.1
cordova -v: 6.4.0
cordova-plugin-badge version: 0.7.4

编辑 2 --------------------

我的 PHP 代码通过 CURL 将通知发送到 Ionic:

$yourApiSecret = "myApiSecret"; // Available in Ionic Dashboard
$androidAppId = "myAndroidAppId"; // Available in Ionic Dashboard
$api_token = "my.api.token"; // Created in Ionic Dashboard

$data = array(
    "tokens" => "send_to_all",
    "profile" => "my_created_profile", //Created in Ionic Dashboard
    "send_to_all" => true,
    "notification" => array(
        'title'     => $title,
        'message'   => $message,
        )
    );

$data_string = json_encode($data);
$ch = curl_init('https://api.ionic.io/push/notifications');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, 
    array(
        'Content-Type: application/json',
        'X-Ionic-Application-Id: '.$androidAppId,
        'Content-Length: ' . strlen($data_string),
        'Authorization: Bearer '.$api_token
        )
    );

$result = curl_exec($ch);

最佳答案

我最近也遇到了同样的问题。默认情况下,Android 不支持推送通知上的徽章。但这是可以做到的:要使这项工作正常进行,您需要 ionic-native/badge 的组合带有推送通知。

可以通过在负载中设置 content_available: 1 将推送通知作为后台通知发送,引用:http://docs.ionic.io/services/push/#ios-background-notifications

虽然该链接特别提到了 iOS,但您可以通过 Ionic Push 通知使用以下有效负载使其在 Android 上运行:

"notification": {
    "android": {
        "content_available": 1,
        "payload": {
            "badge": 5,
            "title": "Alert",
            "text": "Notifications"
        },
        "data": {
            "badge": 5
        }
    }
}

这意味着什么:

content_available:1 在收到推送通知时告诉设备这是一个后台通知,不应提醒用户。因此您的应用将能够处理通知,而不会打扰用户。

payload 这是一个偏好,但这就是我这样做的原因:对我来说,这些后台推送通知有一个神奇的组合。我不希望在应用程序关闭时向用户发出警报,但我想在应用程序打开时处理它。您无法将 titlemessage 放在后台推送通知上,并且仍然在后台静默传送(至少在 Android 上),因此我将此信息放在有效负载,然后手动访问它。

data 这是让 Android 处理后台通知的魔法。使用 ionic 提供的推送插件,有效负载结构与应用程序处理通知的方式极其相关。这是一个很好的引用:https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/PAYLOAD.md#notification-vs-data-payloads

现在,在应用程序中处理消息。

首先,确保您已正确遵循 ionic-native/push 文档来设置插件并将其注入(inject)您的应用中。

app.module中定义提供者

import { Badge } from '@ionic-native/badge';

providers: [
    Badge
]

导入您需要的所有内容:

import { Push, PushToken, IPushMessage } from '@ionic/cloud-angular';
import { Platform, Events } from 'ionic-angular';
import { Badge } from '@ionic-native/badge';

注入(inject):

constructor(
    private badge: Badge
) {}

用它来处理有效负载:

this.push.rx.notification()
    .subscribe((message: IPushMessage) => {
        console.log(message);
        if (message.title && message.text) {
            let notification: AppNotification = {
                title: message.title,
                message: message.text
            };
            // Handle the push notification in app.
        }

        let payload: any = message.payload;
        // Get the badge number off the payload.
        if(payload && payload.badge) {
            // Using the badge plugin, set the badge number.
            this.badge.set(Number(payload.badge));
        }

        if(payload && payload.title && payload.text) {
            let notification: AppNotification = {
                title: payload.title,
                message: payload.text
            };
            // Do something with the background notification if the app is open.
        }
    });

根据 badge 插件的 ionic 文档,当您收到推送通知时,您可以获取有效负载数据,然后使用它来设置徽章编号。此外,如果您愿意,还可以在应用程序中处理推送通知。

希望这有帮助。

关于android - 如何使用 Ionic 2 增加 Android 应用程序图标中的徽章计数通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41864305/

相关文章:

android - 如何将 WearableActivity 与 LiveData 和 ViewModel 一起使用

javascript - 使用 Cordova 文件插件读取文件

android - PhoneGap - 将数据保存到本地文件系统(文件 API)

cordova - 在phonegap应用程序中自动获取OTP

angularjs - Ionic - 当凭据标志为真时,不能在 '*' header 中使用通配符 'Access-Control-Allow-Origin'

java - 当互联网连接丢失时,优雅地处理 NPE 并在 OnPostExecute/AsyncTask 中显示 AlertDialog - Android/Java

android - React native 构建失败并出现异常

android - 前台服务通知始终显示至少 5 秒

android - ionic 3 : Could not find support-compat. aar (com.android.support :support-compat:26. 1.0

javascript - 如何正确应用Angularjs ng-repeat?