公司的项目是混合开发项目,主要以前端页面为主,安卓端提供辅助功能。Android端是以Widget方式集成HTML5+SDK方法 。现在前端页面需要更新升级,参考了这里写链接内容
这里写链接内容,发现单独升级前端html5页面不行(本人主要是安卓开发,对前端不熟悉,所以wgt升级方式没试过,不过他们官网上面的评价好像也说不行)。所以自己弄了套升级方案,亲测可行,下面是过程。
在SDK_WebAPP中,以前我们设置的webapp资源路径为 String appBasePath = "/apps/前端项目的appid";
所以以前我们的html5页面都是放在assets目录下的,assets目录可读不可写。导致后续更新操作无法执行,所以我们可以考虑下从更换资源文件的存放位置来实现更新。
我们可以把appBasePath
这个路径设置为手机SD卡的本地路径,例如我的项目里就是这么设置的:
String sdcard = Environment.getExternalStorageDirectory().toString();
String appBasePath = sdcard + "/Android/data/应用包名/apps/前端项目的appid";
现在呢,手机的SD卡上面是没有这个文件的,所以我们可以把前端资源拿出来,弄成一个压缩文件,放到assets目录下,然后再app启动的时候把压缩文件解压到上面我们设定的那个位置上,当然,不能每一次启动都去解压缩,所以要做判断
String mainfestPath = appBasePath + "/www/manifest.json";
File festFile = new File(mainfestPath);
if (!festFile.exists()) {
try {
//从assets文件解压缩到手机SD卡,请自行百度
boolean isFinish = SystemUtils.unZipAssets(this, "www.zip", appBasePath );
if (isFinish){
//如果解压完成,跳转到包含html5的SDK_WebAPP页面
dumpToWeb();
}
Log.e("SystemUtils.unZi", "执行了解压");
} catch (IOException e) {
e.printStackTrace();
}
} else {
//文件已存在,直接跳转
dumpToWeb();
Log.e("SystemUtils.unZi", "没有执行解压");
}
}
}
修改后的结构如下,记得要把之前放在 apps.前端项目appid.www下的应用资源文件全部删除,不然全部无效!!!
以上,是修改前端资源在手机的存储位置的,下面是对前端资源的更新的。
每次打开app后,先检测对应的手机SD卡有没有menifest.json文件,如果没有,则解压缩,如果有,则将menifest.json文件中的code值与服务器返回的版本号做对比(也可以拿gralde文件中的versionCode或者versionName做对比,效果都差不多,都是判断是否有更新),code值低于服务器版本号的号,则将服务器的压缩文件下载到本地,再将本地的文件删除,最后将下载的压缩文件解压到对应位置。到此,更新完成。
以上,基本就实现了前端包的更新功能。