使用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 sharedApplicationopenURL: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)


原创粉丝点击