Не работает Push-уведомление Worklight с аутентификацией адаптера

#android #push #ibm-mobilefirst #worklight-adapters #worklight-server

#Android #толкать #ibm-mobilefirst #worklight-адаптеры #worklight-сервер

Вопрос:

Я использую Push-уведомление в своем тестовом приложении Worklight. Я выполнил аутентификацию через адаптер Worklight. Но таким образом я всегда получаю ответ от PushAdapter «Подписка для пользователя не найдена :: [sample_username]»

Устройство аутентифицировано:

введите описание изображения здесь

И мое тестовое Android-устройство подписано на уведомление.

введите описание изображения здесь

Мой простой AuthAdapter:

 function onAuthRequired(headers, errorMessage) {
    errorMessage =  errorMessage ? errorMessage : null;
    return {
        authRequired: true,
        errorMessage: errorMessage
    };
}
function submitAuthentication(username, password) {
    var userIdentity = {
            userId: username,
            displayName: username,
            attributes: {
                foo: "bar"
            }
    };
    WL.Server.setActiveUser("AdapterAuthRealm", null);
    WL.Server.setActiveUser("AdapterAuthRealm", userIdentity);

    return {
        authRequired: false
    };
}
  

Возможно, мой код для службы push-уведомлений будет полезен для справки (Angular JS):

     console.log(services.service('PushService'));
    if (WL.Client.Push){

        WL.Client.Push.onReadyToSubscribe = function(){

            WL.Client.Push.registerEventSourceCallback(
                "myPush",
                "PushAdapter",
                "PushEventSource",
                angular.element(document.body).injector().get('PushService').pushNotificationReceived);
        };

    }

    services.service('PushService', function($q) {

        var self = this;
        self.send = function(userID, text) {
            console.info("PushService:: send ",userID, text);
            var deferred = $q.defer();
            if (typeof WL !== 'undefined') {
                WL.Client.invokeProcedure({
                    adapter : 'PushAdapter',
                    procedure : 'submitNotification',
                    parameters : [userID, text]
                },{
                    onSuccess: function(response) {
                        deferred.resolve(response);
                        console.log("PushService:: push response: ",response);
                    },
                    onFailure: function(response) {
                        deferred.reject();
                    }
                });
            } else {
                deferred.reject();
                console.warn("WL is undefined");
            }
            return deferred.promise;
        };

        self.isSupported = function() {
            var isSupported = false;
            if (WL.Client.Push){
                console.log(WL.Client.Push);
                isSupported = WL.Client.Push.isPushSupported();
            }
            return isSupported;
        };
        self.isSubscribed = function() {
            var isSubscribed = false;
            if (WL.Client.Push){
                isSubscribed = WL.Client.Push.isSubscribed('myPush');
            }
            return isSubscribed;
        };
        self.subscribe = function() {
            var deferred = $q.defer();
            WL.Client.Push.subscribe("myPush", {
                onSuccess: function(response) { console.info("Push:: subscribe success"); deferred.resolve(response); },
                onFailure: function() { console.warn("Push:: subscribe failture"); deferred.reject(); }
            });
            return deferred.promise;
        };
        self.unsubscribe = function() {
            var deferred = $q.defer();
            WL.Client.Push.unsubscribe("myPush", {
                onSuccess: function(response) { console.info("Push:: unsubscribe success"); deferred.resolve(response); },
                onFailure: function() { console.warn("Push:: unsubscribe failture"); deferred.reject(); }
            });
            return deferred.promise;
        };
        self.pushNotificationReceived = function(props, payload) {
            console.info("pushNotificationReceived invoked:: ", JSON.stringify(props), JSON.stringify(payload));
        };

        return self;
    });
  

Ответ №1:

Один из возможных сценариев вашей проблемы заключается в том, что вы пытаетесь отправить пользователю сообщение о завершении сеанса. Например, если у вас следующий сценарий:

«serverSessionTimeout = 3» в «conf server worklight.properties» (сеанс завершится через 3 минуты)

И «приложения»»commonjsinitOptions.js «:

 // # How often heartbeat request will be sent to Worklight Server
heartBeatIntervalInSecs: -1,
  

Мобильное приложение не будет отправлять сердцебиение, поэтому после тайм-аута вашего сервера (сеанс завершится), как будто вы вышли из своего приложения на стороне сервера. Итак, вы отписались. Это может быть причиной сбоя в ваших push-уведомлениях.

Возможное решение — включить сердцебиение или увеличить время ожидания сеанса на стороне сервера.


Было бы полезно, если бы вы также могли поделиться своими файлами конфигурации: conf server worklight.properties и «apps\commonjsinitOptions.js » чтобы проверить, так ли это на самом деле. В любом случае, если это так, первый ТОЛЧОК будет после входа в систему в течение 3 минут, а затем после того, как вы начнете получать сообщение об ошибке.

Комментарии:

1. Часть вашего ответа выглядит как комментарий, что может привести к его закрытию. Пожалуйста, перепишите его с ответом (как предположение), находящимся в первой части. Я знаю, что из-за ограничений репутации вы не можете прокомментировать вопрос, пожалуйста, напишите свой вопрос в конце вашего ответа, возможно, после горизонтальной строки (которую вы можете вставить, написав строку с тремя дефисами: —).