【问题标题】:PushPlugin TypeError: Object #<Object> has no method ''execPushPlugin TypeError: Object #<Object> has no method ''exec
【发布时间】:2014-11-22 12:05:08
【问题描述】:

背景

  1. 我安装了PushPlugin。根据我使用自动安装的文档。但是当我运行cordova run android 时,JavaScript 返回错误,'Cannot read property pushNotification of undefined'

  2. 如果我添加

    <script type="text/javascript" charset="utf-8" src="PushNotification.js"></script>
    

    然后错误更改为该问题标题中的错误。

  3. 这就是我的 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()

  4. 根据文档,自动安装插件后,我只需要运行register。但这仍然会导致“无法读取pushNotification....”

  5. 似乎PushNotification.jsdeviceready 触发后自动插入。但是插件没有这样做。如果我在index.html 中插入脚本,则会出现Object has no method 'exec' 错误,因为deviceready 尚未触发。

  6. deviceready

    if ('device is android') {
        document.addEventListener("deviceready", this.onDeviceReady(), false);
    }
    

问题

我做错了什么?我该怎么做?

更新

我才意识到我只尝试了自动安装。我没有尝试过手动步骤。但这不是直接插件安装不起作用的原因

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为它是由于我的设置错误而引起的。因此这个问题是无关紧要的

标签: cordova push-notification phonegap-pushplugin


【解决方案1】:

我终于意识到错误是由于EventListener for deviceready。我变了

  if ('device is android') {
        document.addEventListener("deviceready", this.onDeviceReady(), false);
  }

  document.addEventListener("deviceready", this.onDeviceReady, false);

一切都到位了。虽然这是一个粗心的错误,但我仍然留下这个问题,并为可能遇到此问题的其他人提供答案

【讨论】:

    【解决方案2】:

    我真的不明白,为什么你的解决方案不起作用。我唯一能提供的就是我的工作解决方案。那里可能有一些冗余或不必要的东西,因为我自己尝试了 35 个版本,然后才开始工作:

    首先我在 App Initializer 中附加到 pg 事件并注册我的通知服务:

    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');
        }
    }
    

    然后我的 Manager Service 正在注册设备:

    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
            }
        },
    
    };
    

    希望这可能会有所帮助。

    【讨论】:

    • 感谢您的调查。在尝试不同的方法之前,我尝试安装 Cordova Device 插件,但也没有成功。
    • 看来我初始化和使用Ember的方式可能是原因。我正在努力
    • 我已经尝试了一切,删除平台,添加平台,删除插件,添加它们。我还只使用插件删除了所有 ember 代码,但错误仍然没有改变
    • 我已经更新了我的问题。您现在或许可以为我指明正确的方向!
    • 您是否尝试过使用 build.phonegap.com 构建应用程序,可能是版本问题或其他问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多