问题
Background
I installed PushPlugin. According to the docs I used automatic installation. But when I run
cordova run android
, JavaScript returns the error, 'Cannot read property pushNotification of undefined'If I add
<script type="text/javascript" charset="utf-8" src="PushNotification.js"></script>
then the error changes to the one in this question's title.
This is how my HTML loads the scripts
<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>
Initialization code is in
index.js
where afterdeviceready
I callpushNotification.register
.After the
register
completes, I callMyEmberApp.deferReadiness()
After automatically installing the plugin, I just have to run
register
, according to the docs. But this still leads to 'Cannot readpushNotification
....'It seems that
PushNotification.js
is automatically inserted afterdeviceready
fires. But the plugin is not doing so. If I insert the script inindex.html
, the errorObject has no method 'exec'
occurs becausedeviceready
hasn't fired yet.deviceready
if ('device is android') { document.addEventListener("deviceready", this.onDeviceReady(), false); }
Question
What am I doing wrong? How should I do this?
Update
I just realized that I have only tried the automatic installation. I have not tried the manual steps. But that is no reason why the direct plugin install shouldn't work
回答1:
I finally realized that the error was due to the EventListener
for deviceready
. I changed
if ('device is android') {
document.addEventListener("deviceready", this.onDeviceReady(), false);
}
to
document.addEventListener("deviceready", this.onDeviceReady, false);
and everything fell right into place. Though this is a careless mistake, I still leave this question and it's answers for others who might encounter this issue
回答2:
I can't really see, why ur solution is not working. The only thing I can provide is my working solution. There might be some redundancies or unnecessary things in there, because I myself tried 35 Versions before I got it working:
First Thing is I attach to pg events in an App Initializer and register my 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');
}
}
Then my Manager Service is registering the the device:
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);
},
});
Then in a case of success the ECB is called with the device ID which is could by my handler:
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
}
},
};
Hope this might help.
来源:https://stackoverflow.com/questions/27077173/pushplugin-typeerror-object-object-has-no-method-exec