
转载 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'}]