使用钛金属加速器的推送通知

时间:2016-06-02 15:25:52

标签: appcelerator appcelerator-mobile appcelerator-titanium

我正在使用Titanium的推送通知功能,适用于Android和iOS。我正在从alloy.js初始化推送通知订阅,即基本上调用CloudPush的retrieveDeviceToken方法来获取设备令牌然后

 Cloud.PushNotifications.subscribe({
    channel : _channel,
    device_token : _token,
    type : OS_IOS ? 'ios' : 'android'
  }, function(_event) {..}

挑战在于,每次重启应用程序时都会调用alloy.js。这意味着生成一个新的设备令牌,并在每次重新启动应用程序时反复订阅频道。

我想知道这是否是使用推送订阅的正确方法。有没有办法避免来自同一设备的这些多个订阅。

1 个答案:

答案 0 :(得分:1)

实际上你做的是正确的,但推送通知背后有一个事实:

  • 无论您调用CloudPush.retrieveDeviceToken()方法多少次,您都将获得一个设备令牌。
  • 设备令牌仅在您卸载应用程序并重新安装时才会有所不同。
  • 因此,要避免多次订阅频道,您需要做的就是在Ti.App.Properties中保存设备令牌,然后检查此属性是否有值。

见下面的代码片段:

var CloudPush = require('ti.cloudpush');

            if ( CloudPush.isGooglePlayServicesAvailable() ) {
                CloudPush.retrieveDeviceToken({
                    success : tokenSuccess,
                    error : tokenError
                });

                // Process incoming push notifications
                CloudPush.addEventListener('callback', pushRecieve);

            } else {
                alert("Please enable Google Play Services to register for notifications.");
            }

// Save the device token for subsequent API calls
function tokenSuccess(e) {
    var previousToken = Ti.App.Properties.getString("DEVICE_TOKEN", "");

    var newToken = "" + e.deviceToken;
    Ti.API.info('** New Device Token = ' + newToken);

    if (newToken !== previousToken) {
        Ti.App.Properties.setString("DEVICE_TOKEN", newToken);  

        var Cloud = require("ti.cloud");

        Cloud.PushNotifications.subscribe({
            channel : _channel,
            device_token : newToken,
            type : OS_IOS ? 'ios' : 'android'
        }, function(_event) {});
    }
}


function tokenError(e) {
    alert('Failed to register for push notifications.');
}