使用CrossApp实现版本更新管理(iOS端给AppStore链接,android端下载apk并替换)
来源:互联网 发布:mac粉饼专柜价格表 编辑:程序博客网 时间:2024/05/17 00:01
版本更新管理从思路上来说是挺简单的
1: 和后台的版本信息进行比较
2: 符合更新条件就开始更新(跳转到链接或者下载apk文件)
3: 替换(限android)
第一步: 因人而异,我是和后台人员定好版本号的格式(如1.1 、1.1.1)。因为考虑到适用性我干脆就写了个函数来判断版本号的大小(因为如果是1.1.1这种格式的话就没法直接比较了)
/*
* 判断当前版本号与后台最新版本号
* int ApplicationUpdateManager::compareVersionFormat(string aVersion, string cVersion)
*
* 参数: aVersion -> 当前版本号 cVersion -> 将要比较的版本号
*
* 返回值: 1 -> 当前版本号大于将要比较的版本号 0 -> 等于 -1 -> 小于
*
*/
int ApplicationUpdateManager::compareVersionFormat(string aVersion, string cVersion)
{
for (int i = 0; i < aVersion.size(); i++) {
CCLog("%d,%d",aVersion[i], cVersion[i]);
if (aVersion[i] > cVersion[i])
{
return 1;
}
else if(aVersion[i] < cVersion[i])
{
return -1;
}
}
return 0;
}
第二步: 根据比较结果进行下一步操作。
iOS: 由于苹果特性 只能去AppStore进行更新(下方链接为应用在AppStore的地址)
NSURL *url = [NSURL URLWithString:[NSStristringWithFormat:@"https://itunes.apple.com/cn/app/linkmore/id1095614663?mt=8"]];
[[UIApplication sharedApplication] openURL:url];
Android: 安卓虽然也可以用苹果的方式(提供应用在相对应下载平台的地址),但是普遍的方式还是直接下载apk包进行更新(很多人都不乐意去应用平台更新 0.0 包括我自己)。这样就涉及到下载跨平台引擎一般集成curl实现下载。CrossApp则封装了下载类CADownloadManager.
第三步: 替换原App
iOS: 不需要特殊处理
Android: 在下载完成后执行替换的代码(说实话一天时间弄这个 95%的时间都花在这上面了。我总结下其实主要就是一个问题--文件的访问权限)
我使用跨平台的下载类,获取的可读写路径在Android设备上是 data/data/.../ 是程序安装时系统为这个应用分配的一个存储路径, 而这个路径下的文件是有访问权限限制的。外部应用无法访问。而替换则应是跳出该应用程序了。所以我碰到的问题就是apk明确下载到本地可读写路径了(通过File确认文件存在),但是在跳出App进行替换时总会弹出 "解析程序包时出现问题"。
当时人都懵逼了。首先代码90%是没问题的(因为都跳转到替换程序的。。嗯。轨道?上了(0.0我是这么理解的))。所以我猜想是不是下载时出问题导致apk有问题,试了多次还是一样,但下载进度是完整100%的。我觉得是apk问题的可能性不大,所以先放一边不考虑。
直到看到这两篇文章我意识到估计就是这个问题导致的了
http://www.cnblogs.com/likeshu/p/4881159.html
http://blog.csdn.net/qq_31588719/article/details/70168295
看过之后我意识到他们说的应该是一个意思,一个问题。
我首先尝试修改文件的权限,发现还是出现"解析程序包时出现问题"的情况。但我已经99%的相信就是文件权限的问题了。于是我又照着这个权限问题的思路找啊找。在某一篇文章上看到了让我印象深刻的一句话:授予权限应是嵌套的,意思就是你要授予权限文件的父级文件夹如果权限也是受限制的。那你单单对子文件操作权限是无效的,父文件也应授予权限(大概是这意思,很抱歉,这篇文章的页面被我关掉了,地址找不到了)。此时我放弃通过修改权限来解决问题了。绝定将文件复制到公共环境下(内置存储卡/外置存储卡)。最后问题解决
Android端代码
static void checkApk(String filePath) throws FileNotFoundException
{
String newPath = Environment.getExternalStorageDirectory().getPath()+"/apk名字.apk";
try {
int bytesum = 0;
int byteread = 0;
File oldfile = new File(filePath);
if (oldfile.exists()) { //文件存在时
InputStream inStream = new FileInputStream(filePath); //读入原文件
FileOutputStream fs = new FileOutputStream(newPath);
byte[] buffer = new byte[1444];
int length;
while ( (byteread = inStream.read(buffer)) != -1) {
bytesum += byteread; //字节数 文件大小
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
inStream.close();
}
}
catch (Exception e) {
System.out.println("复制单个文件操作出错");
e.printStackTrace();
}
FileInputStream inStream = new FileInputStream(filePath);
File file = new File(newPath);
if(file.exists())
System.out.println("apk is exist");
else
System.out.println("apk is dont exist");
// String[] command = {"chmod", "777", file.getPath()};
// ProcessBuilder builder = new ProcessBuilder(command);
// try{
// builder.start();
// }catch (IOException e)
// {
// e.printStackTrace();
// }
//替换的Intent
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
context.startActivity(intent);
}
现在想起来,如果我当时直接Copy网上现成的更新代码或许就不会有这么多事了(。或许也会出问题),大概是因为我不想写太多Java代码吧(因为通过JNI调用的函数我都写在一个文件里了,太多的话很不好看,所以不太想写0.0)
- 使用CrossApp实现版本更新管理(iOS端给AppStore链接,android端下载apk并替换)
- Android----- 版本更新和 服务器下载新版本APK并安装
- Android APK版本更新下载
- Android使用AsyncHttpClient给APP更新版本并安装
- Android-async-http下载APK版本更新
- android 自定义进度条下载apk并更新
- Android 版本更新下载自动安装APK,并解决Android6.0安装失败的问题
- Android 版本更新下载自动安装APK,并解决Android6.0,7.0安装失败的问题
- android 利用dwonLoadManager 实现apk下载更新
- Android下载apk全量更新实现
- Android 版本检测、文件下载并更新
- android apk版本更新
- android apk版本更新
- Android apk版本更新
- android apk版本更新
- 检查APK版本并更新
- apk版本更新下载安装
- iOS开发检测AppStore版本更新
- dubboAPl参考手册
- 如何生成压缩文件文件(zip)
- safari input 行高问题解决
- XSSFWorkbook和HSSFWorkbook读取excel
- 深入浅出JMS(一)--JMS基本概念
- 使用CrossApp实现版本更新管理(iOS端给AppStore链接,android端下载apk并替换)
- JEESZ-Redis分布式缓存安装和使用
- dbms_stats包的常用几个信息统计分析
- Python:list的一些方法
- anaconda2安装好后 cmd pip不是内部命令
- 神经网络与深度学习
- 深入浅出JMS(二)--ActiveMQ简单介绍以及安装
- Java 数据结构(一)---排序(二) 交换排序
- Python打开文件,将list、numpy数组内容写入txt文件中