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 中基于标签的推送通知示例的主要内容,如果未能解决你的问题,请参考以下文章

IBM Worklight:推送通知行为

IBM Worklight - 可靠的推送通知

使用 IBM Worklight 和 IBM Bluemix 推送通知

IBM Worklight:iOS 推送通知长度限制

IBM Worklight 和推送通知问题

在 IBM Worklight 推送通知中使用轮询时出现问题