Phonegap Build + Ionic:Plugin' Device'找不到,或者不是CDVPlugin

时间:2014-03-30 16:13:58

标签: iphone phonegap-plugins phonegap-build ionic-framework

所有

我决定尝试使用离子和phonegap构建。一切顺利,直到我尝试使用插件。一旦我尝试调用插件,我就会

  

插件'设备'没找到,或者不是CDVPlugin

在weinre控制台中,我得到了

  

5秒后,deviceready尚未解雇。频道未被解雇:   onCordovaInfoReady

我可以在Phonegap Build上看到插件被识别,如果我下载ipa文件并展开内容,我可以看到一切都在那里。我怀疑这是一个离子问题,因为我正在与Phonegap的Ismael合作(超级敏感且乐于助人,BTW)。他给我发了一个phonegap样本,根据他的配置设置和代码,我运行相同但仍有问题。如果有人能帮助我,我会非常感激。

我做了什么

  1. sudo npm install ionic -g
  2. sudo npm install phonegap -g
  3. sudo npm install cordova -g
  4. sudo ionic start xxxx
  5. sudo ionic platform add ios
  6. cd xxxx
  7. cd www
  8. phonegap remote build ios
  9. 环境

    • OSX 10.9.2
    • 运行iOS 7.1的设备iPhone 4
    • PhoneGap Build项目 版本3.3.0
    • ionic-v1.0.0-beta.1
    • phonegap CLI 3.4.0-0.19.8
    • cordova CLI 3.4.0-0.1.3

    config.xml中

    <?xml version='1.0' encoding='utf-8'?>
    <widget id="com.xxxx.xxxx" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:gap="http://phonegap.com/ns/1.0">
        <name>xxxxxxxx</name>
        <description>
            xxxx
        </description>
        <author email="xxxx@gmail.com">
            xxxx
        </author>
        <content src="index.html" />
        <access origin="*" />
        <preference name="phonegap-version" value="3.3.0" />
        <preference name="fullscreen" value="true" />
        <preference name="webviewbounce" value="false" />
        <preference name="UIWebViewBounce" value="false" />
        <preference name="DisallowOverscroll" value="true" />
        <gap:plugin name="org.apache.cordova.device" />
        <gap:plugin name="org.apache.cordova.media" />
        <gap:plugin name="org.apache.cordova.media-capture" />
        <gap:plugin name="org.apache.cordova.file" />
    </widget>
    

    的index.html

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
        <title>Ionic Seed App</title>
    
        <!-- ionic css -->
        <link href="lib/css/ionic.css" rel="stylesheet">
    
        <!-- your app's css -->
        <link href="css/app.css" rel="stylesheet">
    
        <!-- ionic/angularjs scripts -->
        <script src="lib/js/ionic.bundle.js"></script>
    
        <script src="lib/js/moment.min.js"></script>
    
        <!-- cordova script (this will be a 404 during development) -->
        <script src="cordova.js"></script>
        <!-- your app's script -->
        <script src="js/app.js"></script>
        <script src="js/services.js"></script>
        <script src="js/controllers.js"></script>
    
      </head>
    
      <body ng-app="xxxx" animation="slide-left-right-ios7">
    
        <!--
          The nav bar that will be updated as we navigate between views
          Additional attributes set its look, ion-nav-bar animation and icons
          Icons provided by Ionicons: http://ionicons.com/
        -->
        <ion-nav-bar type="bar-positive"
                 animation="nav-title-slide-ios7"
                 back-button-type="button-icon button-clear"
                 back-button-icon="ion-ios7-arrow-back"></ion-nav-bar>
    
        <!--
          The views will be rendered in the <ion-nav-view> directive below
          Templates are in the /templates folder (but you could also
          have templates inline in this html file if you'd like).
        -->
        <ion-nav-view></ion-nav-view>
    
      </body>
    </html>    
    

    app.js

    var app = angular.module('xxxx', ['ionic', 'xxxx.services', 'xxxx.controllers']);
    
    app.value('globals', {
        'ACSKey': 'xyz',
        'session_id': '',
        'logged_in_userId': ''
    });
    
    app.config(function($stateProvider, $urlRouterProvider) {
    
        // Ionic uses AngularUI Router which uses the concept of states
        // Learn more here: https://github.com/angular-ui/ui-router
        // Set up the various states which the app can be in.
        // Each state's controller can be found in controllers.js
        $stateProvider
    
        .state('login', {
            url: "/login",
            templateUrl: "templates/login.html",
            controller: 'LoginCtrl'
        })
    
        .state('register', {
            url: "/register",
            templateUrl: "templates/register.html",
            controller: 'RegisterCtrl'
        })
    
        // setup an abstract state for the tabs directive
        .state('tab', {
            url: "/tab",
            abstract: true,
            templateUrl: "templates/tabs.html"
        })
    
        .state('main', {
            url: "/main",
            templateUrl: "templates/main.html",
            controller: "MainCtrl"
        })
    
        .state('premise', {
            url: "/premise",
            templateUrl: "templates/premise.html",
            controller: "PremiseOfTheDayCtrl"
        })
    
        .state('friends', {
            url: "/friends",
            templateUrl: "templates/friends.html",
            controller: "FriendsCtrl"
        })
    
        .state('tab.about', {
            url: '/about',
            views: {
                'about-tab': {
                    templateUrl: 'templates/about.html'
                }
            }
        });
    
        // if none of the above states are matched, use this as the fallback
        $urlRouterProvider.otherwise('/login');
    
    });
    
    app.run(function($rootScope, $location, $ionicPlatform) {
    
        document.addEventListener("deviceready", onDeviceReady, false);
    
        function onDeviceReady() {
            alert('deviceready');
        }
    
        // $ionicPlatform.ready(function() {
        //     // Initialize plugin here
        //     console.log('ionicPlatform.ready');
        // });
    
        var _session_id = window.localStorage.getItem("_session_id");
        var logged_in_userId = window.localStorage.getItem("logged_in_userId");
    
        if (_session_id === null || _session_id === '') {
            // no logged user, we should be going to #login
            if (next.templateUrl === "templates/login.html") {
                // already going to #login, no redirect needed
            } else {
                // not going to #login, we should redirect now
                $location.path("/login");
            }
        } else {
            $location.path("/main");
        }
    
    });
    

2 个答案:

答案 0 :(得分:0)

我花了相当多的时间在Phonegap Build上测试插件,发现这些插件适用于Phonegap 2.9,但是在Phonegap Build上打破版本3.1和3.3。

没有解决方法,我已经在iOS和Android本地构建。

即使在本地构建,Phonegap平台也存在一些插件问题,这个脚本在iOS上为我修复了这个问题:

#!/bin/bash
echo "Killing xcode..."
killall Xcode

rm -rf platforms/ios
rm plugins/ios.json
cordova platform add ios
cordova build ios
node .cordova/hooks/after_build/copy_icons_screens.js 
## Above isn't being caught by the hook during iOS for some reason. Hook is caught by Android build
open platforms/ios/*.xcodeproj

在Android方面,一定要清理CordovaLib项目然后清理你的AppName项目 - 顺序很重要。

此处的复制图标和安装插件挂钩也是关键:
http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/

答案 1 :(得分:0)

显然等了几个星期再试一次,让Phonegap Build赶上了。当我再次尝试时,插件被识别并显示了我的录音对话框......