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

时间:2018-01-03 07:16:08

标签: ios git cordova cordova-plugins

我正在使用Phonegap开发iOS应用程序。

当我收到推送通知usijng phonegap-plugin-push时,我正在实施递增徽章编号的流程。

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

我想在应用收到推送通知时实施该流程, app计算当前的徽章编号,递增它并设置badgenumber。

使用push.getApplicationIconBadgeNumber和push.setApplicationIconBadgeNumber, 当app是Foreground时,我的代码下面工作正常, 但是当应用程序是后台,暂停,未运行时,它不起作用。

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 “当应用程序未运行时,可以看到当前徽章计数。”

但是这个我的代码,当app是Foreground时,两个函数都有效, 当应用程序在后台状态下收到推送通知时,徽章编号不会更改。

那么,该网站上的解释是错误的吗?

应用程序的工作方式相同,但推送通知发送服务器端的推送通知选项“content-available”配置为1或不配置。

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

- 版本 -

crodova版本:7.1.0

平台iOS:4.5.4

phonegap-plugin-push:1.10.6

1 个答案:

答案 0 :(得分:0)

我是由myselr解决的。

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

我认为当应用程序状态为" Not runnnig"时,无法更新徽章编号。

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

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

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

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

在config.xml中写下。

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

*** 2:启用&#34;后台刷新&#34;这个应用程序

对于iPhone,您可以启用它 点按&#34;设置 - &gt;一般 - &gt;后台应用刷新&#34;。

*** 3:配置内容可用= 1&amp; id发送数据。

以下是发送数据的示例。

{\&#34; aps \&#34;:{\&#34; alert \&#34;:\&#34; Hello World \&#34;,\&#34; content-available \&#34;:1},\&#34; id \&#34; :3}

在此示例中,id配置为3。

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

*** 4:添加push.finish功能

将此功能添加到&#34; push.on(&#39; notification&#39;,function(data){});&#34;。

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);

});