【问题标题】:Worklight Push notification with Adapter Authentication doesn't work使用适配器身份验证的 Worklight 推送通知不起作用
【发布时间】:2014-06-16 14:18:59
【问题描述】:

我在我的 Worklight 测试应用程序中使用推送通知。我已通过 Worklight Adapter 进行了身份验证。但是通过这种方式,我总是收到 PushAdapter “No subscription found for user:: [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
    };
}

也许,我的推送通知服务代码将有助于帮助(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;
    });

【问题讨论】:

    标签: android push ibm-mobilefirst worklight-adapters worklight-server


    【解决方案1】:

    您的问题的一种可能情况是您尝试向用户发送会话已结束的推送。 例如,如果您有以下场景:

    “conf\server\worklight.properties”中的“serverSessionTimeout=3”(会话将在 3 分钟后结束)

    还有“apps\”“\common\js\initOptions.js”:

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

    移动应用程序不会发送心跳,因此在您的服务器超时(会话将结束)之后,就像您在服务器端注销了您的应用程序一样。所以,你退订了。这可能是您的推送通知失败的原因。

    一种可能的解决方案是启用心跳或增加服务器端会话超时。


    如果您也可以共享您的配置文件会很有帮助:conf\server\worklight.properties 和“apps\\common\js\initOptions.js”以检查是否是这种情况。无论如何,如果是这种情况,第一次 PUSH 将在登录 3 分钟后开始出现错误。

    【讨论】:

    • 您的答案的一部分看起来像评论,这可能会导致关闭它。请用第一部分的答案(作为假设)重写它。我知道,由于声誉限制,您无法对问题发表评论,请在答案的末尾写下您的问题,可能在水平线之后(您可以通过写一个带有三个连字符的行来插入:---)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多