使用适配器身份验证的 Worklight 推送通知不起作用
Posted
技术标签:
【中文标题】使用适配器身份验证的 Worklight 推送通知不起作用【英文标题】:Worklight Push notification with Adapter Authentication doesn't work 【发布时间】: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;
);
【问题讨论】:
【参考方案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 分钟后开始出现错误。
【讨论】:
您的答案的一部分看起来像评论,这可能会导致关闭它。请用第一部分的答案(作为假设)重写它。我知道,由于声誉限制,您无法对问题发表评论,请在答案的末尾写下您的问题,可能在水平线之后(您可以通过写一个带有三个连字符的行来插入:---)。以上是关于使用适配器身份验证的 Worklight 推送通知不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Worklight - 使用 URL 从非 Worklight 应用程序调用推送通知适配器
使用 Worklight 6.1 在 Windows Phone 8 上推送通知的 Toast