 
            
            
            
         admin_jim 2017-11-17
  admin_jim 2017-11-17 
                
                转载 2016年08月09日 08:24:31
来自:http://www.tuicool.com/articles/rimQjyU
Cordova是Node.js的一款第三方依赖包,并托管到 https://www.npmjs.com/ 中。通过npm下载即可:
$ npm install -g cordova
但是考虑到国内伟大的防火墙工程可能无法下载从http://www.npmjs.org/下载Cordova。幸运的是,国内有好几个镜像站点可以供我们使用,更新速度比较快的有淘宝镜像。具体下载方法如下:
(1)通过config命令:(临时指定镜像源)
$ npm config set registry https://registry.npm.taobao.org
$ npm install -g cordova
2.命令行指定:(临时指定镜像源)
$ npm --registry https://registry.npm.taobao.org info underscore
3.编辑 ~/.npmrc,并加入如下内容:(永久指定数据源):
$ registry = https://registry.npm.taobao.org
国内镜像使用可参考: 电脑换源 npm 国内镜像 cnpm
下载Cordova后,通过以下命令可查看当前的Cordova版本:
$ cordova -v
$ npm update -g cordova
下载完Cordova之后,就能创建一个新的CordovaAPP实例程序:
$ cordova create MyApp com.example.myApp HelloWorld
(备注:如果想查看安装APP的进度,可以添加命令行选项 -d 。)
cordova create命令的参数如下:
· 第一个参数是CordovaAPP项目的文件目录,不可选;
· 第二个参数是APP项目的域名标识,可选;
· 第三个参数是APP应用的标题,可选。这个标题也可以后期在config.xml中进行修改。默认值是HelloCordova。
例如,进入MyApp文件夹,为当前的MyApp项目添加浏览器运行平台。
$ cd MyApp
$ cordova platform add browser
$ cordova platform add ios
$ cordova platform add amazon-fireos
$ cordova platform add android
$ cordova platform add blackberry10
$ cordova platform add firefoxos
$ cordova platform add wp8
$ cordova platform add windows
$ cordova platform add amazon-fireos
$ cordova platform add android
$ cordova platform add blackberry10
$ cordova platform add firefoxos
$ cordova platforms ls
$ cordova platform remove blackberry10
$ cordova platform rm android
一定要执行过cordova platform add的特定平台,才能指定cordovarun操作,在该运行平台上浏览效果。
例如,在浏览器中运行MyApp程序:
$ cordova run browser
此时,浏览器自动访问http://localhost:8000/,即可查看到如下界面,说明新建的默认APP项目已经可以跑起来了:
$ cordova build
还可以选择编译特定的运行平台代码:
$ cordova build ios
cordova build命令相当于一下两条命令的简写:
$ cordova prepare ios
$ cordova compile ios
$ cordova emulate android
$ cordova run android
$ cordova help
新建的Cordova APP项目的目录结构如下:
MyApp/
|-- hooks/
|-- README.md
|-- platforms/
|-- browser/
|-- platforms.json
|-- plugins/
|-- cordova-plugin-whitelist/
|-- browser.json
|-- fetch.json
|-- www/
|-- css/
|-- img/
|-- js/
|-- index.html
|-- config.xml
| 目录名 | 描述 | 
| hooks | 存放自定义cordova命令的脚本文件。 | 
| platforms | 各个平台编译后的原生代码工程。备注:该目录在build时会被覆盖。 | 
| plugins | 插件存放的目录。 | 
| www | 源代码目录。其中index.html为应用的入口文件。 | 
Cordova自4.0以后的版本就不再自带任何的API,就连core API 都必须通过插件安装显式写出来。
$ cordova plugin search bar code
结果如下:(2015-11-16)
com.blackberry.community.barcodescanner
com.cordova.plugins.barcodescanner
com.delhivery.barcodescanner
com.gpdi.plugin.myplugin.myplugin
com.heytz.plugins.barcodescanner
com.heytz.plugins.barcodescanner.portrait
com.ishaijaffe.zxingintent
com.manateeworks.barcodescanner
com.mirasense.scanditsdk.plugin
com.phonegap.plugins.barcodescanner
com.virtualama.bs
de.martinreinhardt.cordova.plugins.barcodescanner
org.bloxlab.barcodescanner
org.cloudsky.cordovaplugins.zbar
org.pluginporo.barcode_scan_plugin
org.pluginporo.honeywell_scanner_plugin
$ cordova plugin add <cordova-plugin>
$ cordova plugin add cordova-plugin-device
$ cordova plugin add cordova-plugin-network-information
$ cordova plugin add cordova-plugin-battery-status
$ cordova plugin add cordova-plugin-device-motion
$ cordova plugin add cordova-plugin-device-orientation
$ cordova plugin add cordova-plugin-geolocation
$ cordova plugin add cordova-plugin-camera
$ cordova plugin add cordova-plugin-media-capture
$ cordova plugin add cordova-plugin-media
$ cordova plugin add cordova-plugin-file
$ cordova plugin add cordova-plugin-file-transfer
$ cordova plugin add cordova-plugin-dialogs
$ cordova plugin add cordova-plugin-vibration
$ cordova plugin add cordova-plugin-contacts
$ cordova plugin add cordova-plugin-globalization
$ cordova plugin add cordova-plugin-splashscreen
$ cordova plugin add cordova-plugin-inappbrowser
$ cordova plugin add cordova-plugin-console
$ cordova plugin ls
$ cordova plugin rm cordova-plugin-console
或
$ cordova plugin remove cordova-plugin-console
$ cordova plugin add cordova-plugin-console@latest
$ cordova plugin add cordova-plugin-console@0.2.1
其他实际操作中遇到的问题汇总:
1、APP发布 cordova build –-release android
2、修改android:versionCode方法,app/config.xml
<widgetid="cn.jybd.bi" version="4.0.0"android-versionCode="4"
xmlns="http://www.w3.org/ns/widgets"xmlns:cdv="http://cordova.apache.org/ns/1.0">
其中version对应android:versionName
3、应用名汉字乱码问题解决办法:将app/config.xml文件另存为UTF-8编码格式;
4、使用vconsole.js调试js代码部分;
5、可以将CordovaLib以库的形式集成到android studio工程中,便于调试;
6、本工程需要的cordova插件如下:
$ cordova plugin add cordova-plugin-device
$ cordova plugin add cordova-plugin-dialogs
$ cordova plugin add cordova-plugin-network-information
版本更新源代码:
package cn.jybd.bi;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import org.apache.cordova.*;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extendsCordovaActivity
{
    String newVerName = "";//新版本名称
    int newVerCode = -1;//新版本号
    ProgressDialog pd = null;
    String UPDATE_SERVERAPK = Constant.APK_NAME;
    private Thread downLoadThread;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // Set by <content src="index.html" /> inconfig.xml
        loadUrl(launchUrl);
        new Thread(){
            @Override
            public void run() {
                // TODO Auto-generated method stub
                //super.run();
                Looper.prepare();
                updateVersion();//启动时就检查 或者在菜单中调用
                Looper.loop();
            }
        }.start();
    }
    public void updateVersion(){
        if(getServerVer()){
            int verCode= this.getVerCode(getBaseContext());
            if(newVerCode>verCode){
                doNewVersionUpdate();//更新版本
            }else{
                //alert("")
                notNewVersionUpdate();//提示已是最新版本
            }
        }
    }
    /**
     * 获得版本号
     */
    public int getVerCode(Context context){
        int verCode= -1;
        try {
            String packName =context.getPackageName();
            verCode =context.getPackageManager().getPackageInfo(packName, 0).versionCode;
        } catch (PackageManager.NameNotFoundExceptione) {
            // TODO Auto-generated catch block
            Log.e("版本号获取异常",e.getMessage());
        }
        return verCode;
    }
    /**
     * 获得版本名称
     */
    public String getVerName(Context context){
        String verName = "";
        try {
            String packName =context.getPackageName();
            verName =context.getPackageManager().getPackageInfo(packName, 0).versionName;
        } catch (PackageManager.NameNotFoundExceptione) {
            Log.e("版本名称获取异常", e.getMessage());
        }
        return verName;
    }
    /**
     * 从服务器端获得版本号与版本名称
     * @return
     */
    public boolean getServerVer(){
        try {
            //版本检测地址
            URL url = new URL(Constant.SERVER_VERSION_URL);
            HttpURLConnectionhttpConnection = (HttpURLConnection) url.openConnection();
           httpConnection.setRequestMethod("GET");
            httpConnection.connect();
            InputStreamReader reader = new InputStreamReader(httpConnection.getInputStream());
            BufferedReader bReader = new BufferedReader(reader);
            String json =bReader.readLine();
            JSONArray array = new JSONArray(json);
            JSONObject jsonObj =array.getJSONObject(0);
            newVerCode = Integer.parseInt(jsonObj.getString("verCode"));
            newVerName = jsonObj.getString("verName");
        } catch (Exceptione) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return true;//如果这里改为false 则不更新会退出程序
        }
        return true;
    }
    /**
     * 不更新版本
     */
    public void notNewVersionUpdate(){
        int verCode= this.getVerCode(this);
        String verName = this.getVerName(this);
        StringBuffer sb = new StringBuffer();
        sb.append("当前版本:");
        sb.append(verName);
        sb.append(" Code:");
        sb.append(verCode);
        sb.append("\n已是最新版本,无需更新");
        Dialog dialog = new AlertDialog.Builder(this)
                .setTitle("软件更新")
               .setMessage(sb.toString())
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        //finish();
                    }
                }).create();
        dialog.show();
    }
    /**
     * 更新版本
     */
    public void doNewVersionUpdate(){
        int verCode= this.getVerCode(this);
        String verName = this.getVerName(this);
        StringBuffer sb = new StringBuffer();
        sb.append("当前版本:");
        sb.append(verName);
        sb.append(" Code:");
        sb.append(verCode);
        sb.append(",发现版本:");
        sb.append(newVerName);
        sb.append(" Code:");
        sb.append(newVerCode);
        sb.append(",是否更新");
        Dialog dialog = new AlertDialog.Builder(this)
                .setTitle("软件更新")
                .setMessage(sb.toString())
                .setPositiveButton("更新", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        Intent intent = new Intent();//只调用系统控件下载,不自动下载安装
                        intent.setAction("android.intent.action.VIEW");
                        Uri content_url =Uri.parse(Constant.SERVER_DOWNLOAD_URL);
                        intent.setData(content_url);
                       startActivity(intent);
                    }
                })
                .setNegativeButton("暂不更新", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        //finish();
                    }
                }).create();
        //显示更新框
        dialog.show();
    }
}
/**
*常量配置文件
*/
Constant.java
package cn.jybd.bi;
public class Constant {
   /**
    * 土司显示时间
    */
   public static final int TOAST_SHOWTIME = 2;  
   public static final String APK_NAME = "*****.apk";
   /**
    * 服务器apk版本保存路径
    */
   public static final String SERVER_VERSION_URL = "http://***********/version.js";
   /**
    * 服务器apk下载地址
    */
   public static final String SERVER_DOWNLOAD_URL = "http://**********/BI_Mobile.apk";
}
/*需要放在服务器上,给客户端提醒新版本的信息*/
version.js文件内容格式:JSON
[{'verCode':4,'verName':'4.0.0Beta','apkPath':'http://*********/BI_Mobile.apk'}]