我正在使用WinJS开发WP8.1应用程序。我正在使用推送通知。我想根据推送通知有效负载中收到的“启动”字符串执行逻辑。我的Toast通知有效负载是
<toast launch='launchString'>
<visual>
<binding template='ToastText02'>
<text id='1'>headlineText</text>
<text id='2'>bodyText</text>
</binding>
</visual>
</toast>
我已经注册了一个活动
WinJS.Application.addEventListener("activated", this.onActivated);
定义为
onActivated: function (args) {
if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
if (args.detail.arguments) {
var launchString = args.detail.arguments;
eval("angular.element(document.getElementById('mainBody')).scope().onNotification(launchString)")
}
else {
console.log("Not launched from toast notification")
}
}
}
这里onNotification(launchString)函数具有基于launchString做出一些决策的逻辑。
当应用程序处于前台或在后台运行时,一切正常。但是当应用程序处于被杀死状态时,我尝试通过点击Toast通知来启动,应用程序在启动后立即崩溃。我无法在VS中对此进行调试,因为我无法在调试时重新创建此方案(因为调试器在调试应用程序被终止时退出)。
感谢您的帮助!
编辑: Here是一个类似的问题。
答案 0 :(得分:0)
好的,所以我得到了答案。
onActivated
事件在cordova deviceready
被解雇之前被解雇了。因此,我的代码甚至在加载angular.js之前就调用了角度。因此,当它在前景或后台时,应用程序工作正常,因为angular.js已经加载。为了解决这个问题,我使用了超时并检查angular
是object
。
onActivated: function (args) {
if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
if (args.detail.arguments) {
var launchString = args.detail.arguments;
window.setTimeout(function () {
if(typeof angular !== undefined)
eval("angular.element(document.getElementById('mainBody')).scope().onNotificationWindows(launchString)");
}, 3000);
}
else {
console.log("Not launched from toast notification")
}
}
}