背景
我安装了PushPlugin。根据我使用自动安装的文档。但是,当我运行cordova run android
时,JavaScript会返回错误,并且无法读取未定义的属性pushNotification'
如果我添加
<script type="text/javascript" charset="utf-8" src="PushNotification.js"></script>
然后错误更改为此问题标题中的错误。
这就是我的HTML加载脚本的方式
<script type="text/javascript" src="cordova.js"></script>
<script src="js/libs/jquery-1.10.2.js"></script>
<script src="js/libs/handlebars-1.1.2.js"></script>
<script src="js/libs/ember-1.5.1.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<script type="text/javascript" src="js/model.js"></script>
<script type="text/javascript" src="js/router.js"></script>
<script type="text/javascript" src="js/controller.js"></script>
<script type="text/javascript" src="js/view.js"></script>
初始化代码位于index.js
,deviceready
之后我致电pushNotification.register
。
register
完成后,我致电MyEmberApp.deferReadiness()
根据文档,自动安装插件后,我只需运行register
。但这仍然导致“无法阅读pushNotification
....&#39;
似乎在PushNotification.js
点火后会自动插入deviceready
。但插件并没有这样做。如果我在index.html
中插入脚本,则会出现错误Object has no method 'exec'
,因为deviceready
尚未解雇。
deviceready
if ('device is android') {
document.addEventListener("deviceready", this.onDeviceReady(), false);
}
问题
我做错了什么?我该怎么做?
更新
我刚才意识到我只尝试过自动安装。我还没有尝试过手动步骤。但这并不是直接插件安装不起作用的原因
答案 0 :(得分:2)
我终于意识到错误是由EventListener
deviceready
造成的。我改变了
if ('device is android') {
document.addEventListener("deviceready", this.onDeviceReady(), false);
}
到
document.addEventListener("deviceready", this.onDeviceReady, false);
一切都落到了原地。虽然这是一个粗心的错误,但我仍然留下这个问题,这是其他可能遇到这个问题的人的答案
答案 1 :(得分:1)
我无法真正看到,为什么你的解决方案无效。我唯一能提供的就是我的工作解决方案。可能会有一些冗余或不必要的东西,因为在我开始工作之前我自己尝试了35个版本:
首先,我在App Initializer中附加pg事件并注册我的Notification Services:
Ember.Application.initializer({
name: 'phonegap',
/* ...... */
initialize: function(container, application){
// Push
container.register('notification:manager', GambifyApp.NotificationManager, { singleton: true });
container.register('notification:handler', GambifyApp.NotificationHandler, { instantiate: false });
container.injection('notification:handler', 'appController', 'controller:application');
container.injection('notification:handler', 'commentRoute', 'route:usergroup.comment');
}
}
然后我的经理服务部门正在注册该设备:
GambifyApp.NotificationManager = window.GambifyApp.NotificationManager = Ember.Object.extend({
init: function(){
//var self = this;
var pushNotification = Ember.get(window, 'plugins.pushNotification');
if(!Ember.isEmpty(pushNotification)){
if ( device.platform == 'android' || device.platform == 'Android' )
{
pushNotification.register(
this.successHandler,
this.errorHandler, {
"senderID":GambifyApp.config.android_sender_id,
"ecb":"window.GambifyApp.NotificationHandler.onNotificationGCM"
});
}
} else {
Ember.Logger.error('pushNotification Plugin not running');
}
GambifyApp.NotificationHandler.manager = this;
},
successHandler: function (result) { },
errorHandler: function (error) {
Ember.Logger.error('Error while registering with push:' + error);
},
});
然后在成功的情况下,用我的处理程序可以使用设备ID调用ECB:
GambifyApp.NotificationHandler = window.GambifyApp.NotificationHandler = {
manager: null,
onNotificationGCM: function(e){
console.log('---------- GCM Event:-----------');
console.log(e);
if(e.event === "registered") {
console.log(e.regid); // Registraion ID
}
},
};
希望这可能有所帮助。