Странная ошибка titanium, зарегистрируйтесь для получения push-уведомлений

#javascript #ios #notifications #titanium-mobile #titanium-alloy

#javascript #iOS #уведомления #titanium-мобильный #титановый сплав

Вопрос:

Раньше это работало нормально, но затем стало неустойчивым.

У меня есть базовый оконный контроллер, который регистрирует push-уведомления, все остальные окна в окне навигации происходят отсюда:

 //when base window is set up, set up push notifcations
//register push notifications

    function registerPushNotifications() {

        Titanium.Network.registerForPushNotifications({
            types : [Titanium.Network.NOTIFICATION_TYPE_BADGE, Titanium.Network.NOTIFICATION_TYPE_ALERT],
            success : function(e) {
                var deviceToken = e.deviceToken;
                Ti.API.info("Push notification device token is: "   deviceToken);
                Ti.API.info("Push notification types: "   Titanium.Network.remoteNotificationTypes);
                Ti.API.info("Push notification enabled: "   Titanium.Network.remoteNotificationsEnabled);

                Ti.API.error("device Token is: "   e.deviceToken);

                //return device Token to store in Model.
                return e.deviceToken;
            },
            error : function(e) {
                Ti.API.info("Error during registration: "   e.error);
            },
            callback : function(e) {
                // called when a push notification is received.
                //var data = JSON.parse(e.data);
                alert(e);
                var data = e.data;

                var badgeCount = Ti.UI.iPhone.getAppBadge();
                //Will return the app badges
                badgeCount = badgeCount   1;
                //Incrementing the appbadge
                Ti.UI.iPhone.setAppBadge(badgeCount);
                //Setting new appbadge

                var message = data.message;

                /*
                if (message != '') {
                var my_alert = Ti.UI.createAlertDialog({
                title : '',
                message : message
                });
                my_alert.show();
                }
                */

                var location = data.path;
                var parts = location.split('/');
                var index = parts.length - 1;

                //get type id
                var id = parts[index];
                var type = parts[0];

                //if push notification came from background, open window if not current window
                if (e.inBackground == 1) {


                        } else {

                            //update view directly after entering app from the background.

        });

    };
  

Эта функция регистрируется для push-уведомлений.

До недавнего времени мое приложение начало работать неустойчиво. Всякий раз, когда я получаю push-уведомление, если я выхожу из системы, затем снова вхожу в систему и снова запускаю функцию registerPushNotifications в процессе. Он будет продолжать запускать старые push-уведомления, для свойства e.inBackground установлено значение 1. Несмотря на то, что вы не нажимаете на push-уведомление в фоновом режиме.

Я пытался отменить регистрацию для push-уведомлений при выходе из системы, вот так:

 } else if (e.row.name == '_logout') {
    Ti.API.info('Logout');
    Alloy.Globals.facebookModule.logout();
    //alert(Alloy.Globals.navGroup);
    var login = Alloy.createController('index', {}).getView();
    login.open();
    //clear base controllers
    Alloy.Globals.navGroup.close();
    Alloy.Globals.baseController.close();
    Alloy.Globals.baseController = null;
    Ti.Network.unregisterForPushNotifications();
  

Но мне не повезло.

Я также попытался сбросить push-уведомления, удалив приложение, изменив дату и время и нажав ok для использования push-уведомлений, когда диалоговое окно снова появится. Но это не работает.

Итак, я не уверен, что делать — и почему возникает эта проблема. Я вернул код обратно к более старой версии кода. Та же проблема.

Любые идеи, почему это происходит, приветствия.

Обновить:

Ошибка действительно очень странная и разочаровывающая!

Я только что изолировал его дальше, похоже, что он выдает ошибку, если я получаю push-уведомления на переднем плане.

Если я вернусь к окну, которое отвечает за регистрацию push-уведомлений, push-уведомление на переднем плане продолжит выполняться, но на этот раз думая, что оно пришло из фона.

 function registerPushNotifications() {

    Titanium.Network.registerForPushNotifications({
        types : [Titanium.Network.NOTIFICATION_TYPE_BADGE, Titanium.Network.NOTIFICATION_TYPE_ALERT],
        success : function(e) {
            var deviceToken = e.deviceToken;
            Ti.API.info("Push notification device token is: "   deviceToken);
            Ti.API.info("Push notification types: "   Titanium.Network.remoteNotificationTypes);
            Ti.API.info("Push notification enabled: "   Titanium.Network.remoteNotificationsEnabled);

            Ti.API.error("device Token is: "   e.deviceToken);

            //return device Token to store in Model.
            return e.deviceToken;
        },
        error : function(e) {
            Ti.API.info("Error during registration: "   e.error);
        },
        callback : function(e) {
            // called when a push notification is received.
            //var data = JSON.parse(e.data);
            alert(e);
            var data = e.data;

            var badgeCount = Ti.UI.iPhone.getAppBadge();
            //Will return the app badges
            badgeCount = badgeCount   1;
            //Incrementing the appbadge
            Ti.UI.iPhone.setAppBadge(badgeCount);
            //Setting new appbadge

            var message = data.message;
        }});

};

registerPushNotifications();

$.winLogin.open();
  

Действительно разочаровывающая ошибка — довольно застрял. 🙁

обновление 2:

 var deviceToken = null;


if(Alloy.Globals.testFlag==0){  
Ti.Network.registerForPushNotifications({
    // Specifies which notifications to receive
    types: [
        Ti.Network.NOTIFICATION_TYPE_BADGE,
        Ti.Network.NOTIFICATION_TYPE_ALERT,
        Ti.Network.NOTIFICATION_TYPE_SOUND
    ],
    success: deviceTokenSuccess,
    error: deviceTokenError,
    callback: receivePush
});
// Process incoming push notifications
function receivePush(e) {
    alert('Received push: '   e);
}
// Save the device token for subsequent API calls
function deviceTokenSuccess(e) {
    deviceToken = e.deviceToken;
    Alloy.Globals.testFlag = 1;
}

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

}
  

Я обернул глобальную переменную, которая является флагом, вокруг регистра для прослушивателя событий push-уведомлений.

Я больше не получаю эту ошибку.

Таким образом, кажется, что каждый раз, когда окно открывается (и закрывается), этот прослушиватель событий дублируется, вызывая странное поведение.

Я не уверен, почему это происходит, когда закрытое окно должно быть удалено из памяти, так же как и прослушиватель событий. Или прослушиватель событий ведет себя так — как только он установлен в приложении, он сохраняется в глобальной памяти?

Ответ №1:

Это не ваша вина, это ошибка в titanium NetworkModule.m.

В NetowrkModule.m есть функция ‘registerForPushNotifications’, в конце функции,

 // check to see upon registration if we were started with a push 
// notification and if so, go ahead and trigger our callback
id currentNotification = [[TiApp app] remoteNotification];
if (currentNotification!=nil amp;amp; pushNotificationCallback!=nil)
{
    NSMutableDictionary * event = [TiUtils dictionaryWithCode:0 message:nil];
    [event setObject:currentNotification forKey:@"data"];
    [event setObject:NUMBOOL(YES) forKey:@"inBackground"];
    [self _fireEventToListener:@"remote" withObject:event listener:pushNotificationCallback thisObject:nil];
}
  

Titanium кэшировал remoteNotification как переменную в TiApp.m, она запускает событие сразу после регистрации pn.

Вы можете либо закомментировать коды этой части, либо принудительно отменить все события обратного вызова, прежде чем ваш push-токен вернется.