IBM worklight 中基于标签的推送通知示例
Posted
技术标签:
【中文标题】IBM worklight 中基于标签的推送通知示例【英文标题】:Tag based Push notification example in IBM worklight 【发布时间】:2015-07-16 13:59:39 【问题描述】:问题 1:
我正在尝试使用 IBM worklight 实现基于标签的推送通知。正如培训材料中所建议的,我在应用程序描述符文件中添加了标签。我还订阅了 main.js
文件中的特定标记名。
后续步骤:
-
在 application-descriptor.xml 中添加了带有标签名称 OFFERS 的标签。
在
WL.Client.Push.onReadyToSubscribe
函数中使用WL.Client.PushsubscribeTag("OFFERS", onSuccess:doSubscribeSuccess , onFailure: doSubscribeFailure)
订阅了该标签。
已添加WL.client.Push.onMessage(props,payload)
来处理收到的通知。
在加载应用程序时,它会转到 main.js
(附加)中的 doSubscribeMethod
,但不会调用回调方法 doSubscribeSuccess。
在调用适配器发送通知时(SubmitBroadcastNotification 过程)我提到了我订阅的标记名(OFFERS)。
在控制台中显示Failed to send Notification Reason FPWSE0009E. No devices found
问题2: WL.Server.CreateEventsource 何时会调用此过程。
注意:关于推送通知配置的所有步骤都已遵循,并且为基于事件的推送提供的示例代码工作正常。
编辑: 我已在 logcat 下方附加了以下 log sn-p 中突出显示的错误。
07-18 18:19:19.253:D/CordovaLog(1081):file:///android_asset/www/default/worklight/cordova.js:第 1061 行:processMessage 失败:堆栈:TypeError:无法读取属性'未定义的 hideView' 07-18 18:19:19.253: D/CordovaLog(1081): 在 wlEnvInit (file:///android_asset/www/default/js/main.js:77:78) 07-18 18:19:19.253: D/CordovaLog(1081): 在文件:///android_asset/www/default/worklight/worklight.js:7638:5 07-18 18:19:19.253: D/CordovaLog(1081): 在 Object.onSuccess (file:///android_asset/www/default/worklight/worklight.js:7665:5) 07-18 18:19:19.253: D/CordovaLog(1081): 在 finalizeInit (file:///android_asset/www/default/worklight/worklight.js:6972:15) 07-18 18:19:19.253:D/CordovaLog(1081):在对象处。 (文件:///android_asset/www/default/worklight/worklight.js:7812:7) 07-18 18:19:19.253:D/CordovaLog(1081):在对象处。 (文件:///android_asset/www/default/worklight/wljq.js:1202:33) 07-18 18:19:19.253: D/CordovaLog(1081): 在文件:///android_asset/www/default/worklight/wljq.js:1047:30 07-18 18:19:19.253: D/CordovaLog(1081): 在 Object.resolveWith (file:///android_asset/www/default/worklight/wljq.js:1158:7) 07-18 18:19:19.253: D/CordovaLog(1081): 在 Object.resolve (file:///android_asset/www/default/worklight/wljq.js:1247:34) 07-18 18:19:19.253: D/CordovaLog(1081): 在 deviceIDSuccessCallback (file:///android_asset/www/default/worklight/worklight.js:7732:22) 07-18 18:19:19.253:I/Web 控制台(1081):processMessage 失败:堆栈:TypeError:无法读取未定义的属性“hideView” 07-18 18:19:19.253: I/Web 控制台 (1081): 在 wlEnvInit (file:///android_asset/www/default/js/main.js:77:78) 07-18 18:19:19.253:I/Web 控制台(1081):在文件:///android_asset/www/default/worklight/worklight.js:7638:5 07-18 18:19:19.253: I/Web 控制台 (1081): 在 Object.onSuccess (file:///android_asset/www/default/worklight/worklight.js:7665:5) 07-18 18:19:19.253: I/Web 控制台 (1081): 在 finalizeInit (file:///android_asset/www/default/worklight/worklight.js:6972:15) 07-18 18:19:19.253:I/Web 控制台(1081):在对象处。 (文件:///android_asset/www/default/worklight/worklight.js:7812:7) 07-18 18:19:19.253:I/Web 控制台(1081):在对象处。 (文件:///android_asset/www/default/worklight/wljq.js:1202:33) 07-18 18:19:19.253:I/Web 控制台(1081):在文件:///android_asset/www/default/worklight/wljq.js:1047:30 07-18 18:19:19.253: I/Web 控制台 (1081): 在 Object.resolveWith (file:///android_asset/www/default/worklight/wljq.js:1158:7) 07-18 18:19:19.253: I/Web 控制台 (1081): 在 Object.resolve (file:///android_asset/www/default/worklight/wljq.js:1247:34) 07-18 18:19:19.253: I/Web 控制台 (1081): 在 deviceIDSuccessCallback (file:///android_asset/www/default/worklight/worklight.js:7732:22) 在 file:///android_asset/www /default/worklight/cordova.js:1061 07-18 18:19:19.263:D/CordovaLog(1081):file:///android_asset/www/default/worklight/cordova.js:第 1062 行:processMessage 失败:消息:S01 DeviceAuth365622402 s90e2f8ab-3e50-3564-921f -b4887579e4a2 07-18 18:19:19.263:I/Web 控制台(1081):processMessage 失败:消息:S01 DeviceAuth365622402 s90e2f8ab-3e50-3564-921f-b4887579e4a2 在 file:///android_asset/www/default/worklight/cordova.js :1062 07-18 18:19:19.313: E/NONE(1081): 与 MBaaS 的连接成功建立 07-18 18:19:19.323:W/PluginManager(1081):线程警告:对 LoggerPlugin.log 的 exec() 调用阻塞了主线程 22 毫秒。插件应该使用 CordovaInterface.getThreadPool()。 07-18 18:19:19.383: D/NONE(1081): Ganesh doSubscribe featurefalse 07-18 18:19:19.443:W/PluginManager(1081):线程警告:对 LoggerPlugin.log 的 exec() 调用阻塞了主线程 19 毫秒。插件应该使用 CordovaInterface.getThreadPool()。 07-18 18:19:19.453: D/NONE(1081): Ganesh doSubscribe 功能已输入 07-18 18:19:19.484:W/PluginManager(1081):线程警告:对 LoggerPlugin.log 的 exec() 调用阻塞了主线程 40 毫秒。插件应该使用 CordovaInterface.getThreadPool()。 07-18 18:19:19.543: E/NONE(1081): 无法订阅,通知令牌未在服务器上更新 07-18 18:19:19.563: D/dalvikvm(1081): GC_CONCURRENT freed 426K, 26% free 3050K/4080K, paused 14ms+35ms,总共195ms
【问题讨论】:
你能试着把你的问题格式化一下吗?按原样遵循有点困难。 ***.com/help/formatting 【参考方案1】:如果您的应用程序基于标记通知示例,则不会使用 WL.Server.createEventSource
,因为该 API 方法用于基于事件源的通知而不是基于标记的通知。
确保您遵循基于标签的通知的正确示例,可在此处找到:https://developer.ibm.com/mobilefirstplatform/documentation/getting-started-7-0/notifications/push-notifications-hybrid-applications/tag-based-notifications/
接下来,不清楚你是在 ios 还是 Android 上测试,是否设置正确。请确保您拥有:https://developer.ibm.com/mobilefirstplatform/documentation/getting-started-7-0/notifications/push-notifications-hybrid-applications/
现在,您需要确保遵循示例应用程序 (download link) 的实施步骤。查看示例中的这个 main.js 实现 sn-p:
//---------------------------- Check if push support is available ----------------------
function isPushSupported()
var isSupported = false;
if (WL.Client.Push)
isSupported = WL.Client.Push.isPushSupported();
WL.SimpleDialog.show("Tag Notifications", JSON.stringify(isSupported), [
text : 'Close',
handler : function()
]);
//---------------------------- Set up push notifications -------------------------------
if (WL.Client.Push)
WL.Client.Push.onReadyToSubscribe = function()
WL.SimpleDialog.show("Tag Notifications", "Ready to subscribe", [
text : 'Close',
handler : function()
]);
$('.subscribeToTagButton').removeAttr('disabled');
$('.unsubscribeFromTagButton').removeAttr('disabled');
;
// --------------------------------- Subscribe to tag ----------------------------------
function subscribeToSampleTag1()
WL.Client.Push.subscribeTag("sample-tag1",
onSuccess: subscribeTagSuccess,
onFailure: subscribeTagFailure
);
function subscribeToSampleTag2()
WL.Client.Push.subscribeTag("sample-tag2",
onSuccess: subscribeTagSuccess,
onFailure: subscribeTagFailure
);
function subscribeTagSuccess()
WL.SimpleDialog.show("Tag Notifications", "Subscribed to tag", [
text : 'Close',
handler : function()
]);
function subscribeTagFailure()
WL.SimpleDialog.show("Tag Notifications", "Failed subscribing to tag", [
text : 'Close',
handler : function()
]);
// ------------------------------- Check if subscribed ---------------------------------
function isSubscribedToTags()
var subscribedTagsSample1 = WL.Client.Push.isTagSubscribed("sample-tag1");
var subscribedTagsSample2 = WL.Client.Push.isTagSubscribed("sample-tag2");
WL.SimpleDialog.show("Tag Notifications", 'sample-tag1: ' + subscribedTagsSample1 + '\n' + 'sample-tag2: ' + subscribedTagsSample2, [
text : 'Close',
handler : function()
]);
// ------------------------------- Unsubscribe from tag --------------------------------
function unsubscribeFromSampleTag1()
WL.Client.Push.unsubscribeTag("sample-tag1",
onSuccess: unsubscribeTagSuccess,
onFailure: unsubscribeTagFailure
);
function unsubscribeFromSampleTag2()
WL.Client.Push.unsubscribeTag("sample-tag2",
onSuccess: unsubscribeTagSuccess,
onFailure: unsubscribeTagFailure
);
function unsubscribeTagSuccess(response)
WL.SimpleDialog.show("Tag Notifications", "Unsubscribe from tag", [
text : 'Close',
handler : function()
]);
function unsubscribeTagFailure(response)
WL.SimpleDialog.show("Tag Notifications", "Failed subscribing from tag", [
text : 'Close',
handler : function()
]);
//------------------------------- Handle received notification ---------------------------------------
WL.Client.Push.onMessage = function (props, payload)
WL.SimpleDialog.show("Tag Notifications", "Provider notification data: " + JSON.stringify(props), [
text : 'Close',
handler : function()
WL.SimpleDialog.show("Tag Notifications", "Application notification data: " + JSON.stringify(payload), [
text : 'Close',
handler : function()
]);
]);
;
【讨论】:
嗨,伊丹,感谢您的回复。我的应用程序将同时使用基于事件和基于标签的通知。截至目前,我正在使用 android 进行测试。我将按照您的建议尝试示例程序。您能否让我知道 WL.Server.createEventSource 的 abt 调用。至于何时何地会被调用。还建议如果我同时使用这两种类型的通知,我应该将事件源代码保存在单独的 js 文件中吗?? 代码分离是适用的...写它对你来说更方便。您只有在登录后才能使用事件源通知。查看事件源通知教程。 现在基于标签的通知教程运行良好。但是,在尝试与我的应用程序集成时,我得到了 ** Can't subscribe 通知服务器未在服务器上更新 ** 。在调用订阅之前是否必须调用WL.Client.connect
。
更新了我原来的问题。请就我发布的错误提出建议
是的,先尝试连接。以上是关于IBM worklight 中基于标签的推送通知示例的主要内容,如果未能解决你的问题,请参考以下文章