当应用程序在Phonegap(cordova)的后台状态下收到推送通知时增加徽章编号,

Posted

技术标签:

【中文标题】当应用程序在Phonegap(cordova)的后台状态下收到推送通知时增加徽章编号,【英文标题】:Incrementing badge number when app receives push notification in background state for Phonegap (cordova), 【发布时间】:2018-01-03 07:16:07 【问题描述】:

我正在使用 Phonegap 开发 ios 应用。

我正在实现当应用收到推送通知时增加徽章编号的过程,使用 phonegap-plugin-push。

在发送推送通知的服务器端, 徽章编号未配置。

我想在应用收到推送通知时实现该流程, 应用程序计算当前徽章编号,将其递增并设置徽章编号。

使用 push.getApplicationIconBadgeNumber 和 push.setApplicationIconBadgeNumber, 当应用程序是前台时,我的代码下方运行良好, 但是当app是Background、Suspended、Not running时就不行了。

var app = 
    // Application Constructor
    initialize: function() 
        this.bindEvents();
    ,
    bindEvents: function() 
    document.addEventListener('deviceready', this.onDeviceReady, false);
    ,
    onDeviceReady: function() 
        console.log('Received Device Ready Event');
        console.log('calling setup push');
        console.log('platform : '+device.platform);

        if ((device.platform == 'iOS') || (device.platform == 'android')) 
            app.setupPush();
        
    ,
    setupPush: function() 
        console.log('calling push init');
        var push = PushNotification.init(
            "android": 
                "senderID": "xxxxxxxxxx"
            ,
            "browser": ,
            "ios": 
                "sound": true,
                "vibration": true,
                "badge": true
            ,
            "windows": 
        );

        push.on('registration', function(data) 
            console.log('registration event: ' + data.registrationId);

            var oldRegId = localStorage.getItem(key);

            console.log('oldRegId : ' + oldRegId);

            if (oldRegId !== data.registrationId) 
                console.log('different ID');
                localStorage.setItem(key, data.registrationId);
            
        );

        push.on('error', function(e) 
            console.log("push error = " + e.message);
        );

        push.on('notification', function(data) 
            console.log('notification event');
            navigator.notification.alert(
                data.message,         // message
                null,                 // callback
                data.title,           // title
                'Ok'                  // buttonName
            );

            push.getApplicationIconBadgeNumber(function(count) 
                console.log('get badge : ' + count);
                count++;

                push.setApplicationIconBadgeNumber(function() 
                    console.log('set badge : ' + count);
                , function() 
                    console.log('set badge error');
                , count);

            , function() 
                console.log('get badge error');
            );
        );
    
;

在这个网站上,

https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/API.md#pushfinishsuccesshandler-errorhandler-id---ios-only

push.setApplicationIconBadgeNumber 解释 “设置应用程序未运行时可见的徽章计数”,以及 push.getApplicationIconBadgeNumber 解释 “在应用未运行时获取当前徽章计数”。

但是这是我的代码,当应用程序是前台时,这两个功能都有效, 并且当应用收到后台状态的推送通知时,徽章编号不会更改。

那么,那个网站上写的解释错了吗?

应用程序的工作原理相同,但推送通知选项“内容可用”在推送通知发送服务器端配置为 1 或未配置。

所以,请告诉我应该写什么代码。

-- 版本--

crodova 版本:7.1.0

平台 iOS:4.5.4

phonegap-plugin-push : 1.10.6

【问题讨论】:

【参考方案1】:

我通过myselr解决了。

但是,当应用状态为“未运行”时,徽章编号不会更新。

我认为当应用状态为“未运行”时,无法更新徽章编号。

所以,这将是这个应用程序的规范。

如果您想在应用状态为“未运行”时更新徽章编号, 我认为您可以通过在发送服务器端定义徽章编号来实现它。

以下步骤可以解决我的问题。

*** 1:使用cordova-plugin-background-fetch

在 config.xml 中写下。

<plugin name="cordova-plugin-background-fetch" source="npm" />

*** 2 : 开启此应用的“后台刷新”

对于 iPhone,您可以使用 点击“设置 -> 常规 -> 后台应用刷新”。

*** 3 : 配置 content-available=1 & id 发送数据。

以下是发送数据的示例。

\"aps\": \"alert\": \"Hello World\",\"content-available\": 1 , \"id\" : 3

在本例中,id 配置为 3。

此 id 用于 push.finish 函数(请参阅下一节)。

*** 4 : 添加 push.finish 函数

将此函数添加到“push.on('notification', function(data));”中。

data.additionalData的id名称对应发送数据的id名称。

(在官网查看push.finish函数的规范)

push.on('notification', function(data) 
    console.log('notification event');

    navigator.notification.alert(
        data.message,         // message
        null,                 // callback
        data.title,           // title
        'Ok'                  // buttonName
    );

    push.getApplicationIconBadgeNumber(function(count) 
        //alert('get badge : ' + count);
        console.log('get badge : ' + count);
        count++;

        push.setApplicationIconBadgeNumber(function() 
            console.log('set badge : ' + count);
        , function() 
            console.log('set badge error');
        , count);

    , function() 
        console.log('get badge error: ' + count);
    );


    //alert('notId: ' + data.additionalData.notId);
    console.log('notification id: ' + data.additionalData.id);

    // do something with the push data
    // then call finish to let the OS know we are done
    push.finish(function() 
        console.log("processing of push data is finished");
    , function() 
        console.log("something went wrong with push.finish for ID =", data.additionalData.id)
    , data.additionalData.id);

);

【讨论】:

以上是关于当应用程序在Phonegap(cordova)的后台状态下收到推送通知时增加徽章编号,的主要内容,如果未能解决你的问题,请参考以下文章

出现屏幕键盘时保留页面布局(iOS/phonegap)

div 标签在使用 PhoneGap 构建的 iOS 应用程序中是可选的

phonegap 应用程序中 div 周围的橙色边框

在 HTML5 phonegap IOS 应用程序中创建滚动 Div - 没有高度

当软键盘出现在phonegap中时隐藏输入字段

PhoneGap Android + jQuery 移动应用不向下滚动