iOS自动检查更新

摘要:

我们每天在app store收到新的应用更新通知,打开应用时也是不是弹出更新的提示框,自动检查更新这个功能随处可见,虽然作为用户来说老看到这种提示挺烦的,但是作为开发者来说让用户始终更新到最新的版本是最好的,个人认为减少用户厌烦情绪的方法之一是详细地说明更新的地方和原因,这样用户会好接受的多。现在就讲讲怎么在工程内实现自动检查更新。

两种方法:

1、检测服务器上给出的版本号,与自身版本对比

如果不是单机应用或游戏,那就会经常需要与自身的后台服务器进行数据通信,与其他通信一样,可以在打开app时向后台请求最新的版本号,得到回复后,与自身的版本号进行对比,如果有新的版本,则提示用户进行更新。

这一方法在android应用上比较常见,因为应用市场多且杂,由自己来掌握更新会放心得多,但作为ios端来说,因为提交新版本给app store需要一段时间的审核才能让用户下载到,所以实时性有些差,这也是为什么有时候会碰到应用提示更新而app store并没有看到更新字样的原因,解决办法就是等审核通过后再把后台服务器上提供的版本号更新,也很方便,另一个缺点可能就是需要一个服务器了吧。

这种方法与其他的与后台进行通信没什么不同,就不具体讲了。

2、向app store请求版本信息,与自身版本对比

苹果市场的统一在这里就体现出优势了,所有的应用都在这里,只要更新提交审核通过了就可以获取最新的版本信息,没通过的话获取的就还是原来的版本信息,实时性是很好的,而且在请求版本信息时,去往app store下载的链接也会一并返回,可以直接使用,非常方便。但像苹果的服务器请求数据想象起来还是没有向自己的服务器请求的靠谱,具体使用效果如何,等我体验过之后,才会知道啦。

这种方法需要向苹果的服务器请求数据,本文重点说明这一种方法。

向app store请求版本信息:

AppID:当我们在自己的开发者中心创建一个应用后,就会得到一个应用的专属AppID,这个AppID不是我们创建证书时创建的那个Identifier,而是自动生成的一串唯一的数字,在开发者中心创建应用后,进入应用的网页后,网址最后面的那串数字就是我们应用的AppID,我们就是凭借这个AppID告诉app store我们要查询的是哪个应用的版本信息。

查到自己的AppID后就可以进行版本信息的请求了,url是固定的,改变的只有最后的AppID,同时我们也把当下的版本获取到,这里简单地写一个,真是应用的话,应该长久保存在本地。

    NSString *currentVersion = @"0.9"; // 现在的版本
    NSString *appID = @"你的应用的AppID";// 此app的ID
    // 请求url
    NSString *versionUrl = [NSString stringWithFormat:@"http://itunes.apple.com/cn/lookup?id=%@", appID];
    NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:versionUrl]];

处理返回的数据:

app store 返回的数据是一个多层嵌套的json数据,这里直接给出如何解析获得我们需要的版本号及下载链接。其实获取的还有其他的信息,具体想了解的话可以输出查看一下。

    // 收到的回复
    NSData *response = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:nil];

    // 转换成键值对形式
    NSError *error;
    NSDictionary *appInfoDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
    if (error) {
        NSLog(@"error: %@", [error description]);
        return;
    }
    NSLog(@"%@", appInfoDic);// 可输出查看回复的详细信息

    // 查看具体内容中内容数是否为空
    NSArray *resultsArray = [appInfoDic objectForKey:@"results"];
    if (![resultsArray count]) {
        NSLog(@"error: resultsArray == nil");
        return;
    }
    // 获取具体需要的信息
    NSDictionary *infoDic = [resultsArray objectAtIndex:0];
    self.latestVersion = [infoDic objectForKey:@"version"];// 版本号
    self.trackViewUrl = [infoDic objectForKey:@"trackViewUrl"];// 更新的url地址

这里在第一次转换成Dictionary格式后,可以输出看看都获取了一些什么信息,之后就是具体提出我们需要的版本号来进行对比,以及去往app store更新的url地址。

提示用户更新:

获取到app store上最新的版本号后,就可以和本地存储的版本号进行对比了,如果有新的版本,就弹出提示框提示用户有新版本。

    // 弹出提示框
    if (![currentVersion isEqualToString:self.latestVersion]) {
        NSString *messageStr = [NSString stringWithFormat:@"发现新版本:%@,是否前往更新?", self.latestVersion];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"更新提示" message:messageStr delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"更新", nil];
        alert.tag = 10000;// 给提示框加上标签告知是更新的提示框
        [alert show];
    }

PS:当应用更迭了很多个版本后,我们可能很难一直维护支持所有的版本,有时候旧版本的健壮性不是很好的话,甚至使用起来会出很多问题,所以可能就需要会要强制更新,这是提示框应该只提供更新的按钮,不更新则不允许使用应用。如果是采用的第一种方法来检测更新,我们就可以传递一个数据告知应用低于多少版本的需要更新,但是如果采用的是第二种方法,向app store检测更新的话,如何告诉应用必须更新呢?这里我还没想好,希望有大神可以指教一下~

如果用户点击更新的话,就通过刚才获取的url跳转到app store去更新:

// 提示框的响应
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (alertView.tag == 10000) {// 是更新的提示框
        if (buttonIndex == 1) {
            // 前往app store更新
            NSURL *url = [NSURL URLWithString:self.trackViewUrl];
            [[UIApplication sharedApplication]openURL:url];
        }
    }
}

至此就完成了第二种方法的实现,向app store请求版本号来实现自动检测更新。

这里有工程源码:https://github.com/Cloudox/UpdateTest

转载请注明出处,谢谢

参考资料:

iOS开发 APP如何实现检测更新:http://jingyan.baidu.com/article/335530da8b1e0419cb41c305.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 00:35:12

iOS自动检查更新的相关文章

iOS自动打包[转载]

敲一下enter键,完成iOS的打包工作[转载] http://ios.jobbole.com/84677/ 作为开发人员,免不了要为测试人员打包,让其测试.而打包这个行为是非常无聊的,特别是在每个新版本上线前一两天,总会出现一些莫名其妙的bug,然后这两天打包活动也是特别频繁.一天要重复好几次同样的动作,作为一个程序员,去做这样的事情,是完全无法容忍的.自动化打包,好在有你.所以今天就来谈一谈iOS应用自动化打包,但是本篇文章主要谈的是打单一的测试包,并不是在讲持续集成. xcodebuild

禁用quartz自动检查更新

禁用quartz自动检查更新的3种方法 1, <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref

iOS 自动登录的讲解

iOS 的自动登录 就是 先要用户名和密码 登入成功 后  保存到本地的数据库中   然后下次打开的程序的时候 直接取出本地数据库中的用户名和密码 iOS登录及token的业务逻辑 登录的业务逻辑 { http:是短连接. 服务器如何判断当前用户是否登录? // 1. 如果是即时通信类:长连接. // 如何保证服务器跟客户端保持长连接状态? // "心跳包" 用来检测用户是否在线!用来做长连接! http:短连接使用token 机制来验证用户安全性 // token 值: 登录令牌!

**IOS自动完成(搜索自动提示)功能实现

UISearchBar搜索AutoComplete下拉列表搜索提示 http://www.codeios.com/thread-10685-1-1.html 介绍: 在搜索框上加入下拉列表.在搜索框上面输入文字时,出现下拉列表,可以用作搜索自动提示. 测试环境: [Code4App]编译测试,测试环境:Xcode 4.3, iOS 5.0. http://code4app.com/ios/Drop-Down-List/5002d3706803faf208000000

iOS自动检测版本更新

虽然苹果官方是不允许应用自动检测更新,提示用户下载,因为苹果会提示你有多少个软件需要更新,但是有的时候提示用户一下有新版还是很有必要的. 首先说一下原理: 每个上架的苹果应用程序,都会有一个应用程序的ID,根据这个ID我们就可以获取到当前程序的最新版本号,然后和自己的版本号作比较,如果一样的话就是最新版,反之就不是新版,就可以提示用户来手动下载最新版的程序.因为有ID所以就可以定位到这个APP,点击下载即可. 源码: 一般建议检测更新的代码放到主页控制器里. 首先还要导入一个头文件用来打开App

ios自动滚动图片功能源码

源码AdScrollerView,一个已经封装好的UIScrollView的子类,可以自动滚动图片以及对应的描述语,类似淘宝app首页的广告滚动效果.滚动图片数量不限,并且显示pageControl. 效果图: <ignore_js_op> 源码下载: http://code.662p.com/view/9763.html 使用方法: 导入demo中的AdScrollerView文件夹,并导入头文件: #import "AdScrollView.h" #import &qu

使用mac进行ios自动打包(一)

随着ios平台的发展以及发布要求的多样性,测试的需求,自动打包可一定程度上提高效率. 自动打包的方式有如下几种: 一.xcode. xctool进行自动打包 参考网页地址:http://www.tuicool.com/articles/uIZRZjy 1.确保安装了xctool 没有安装xctool,可以用brew安装,没有安装brew的,可以通过搜索安装brew,然后执行如下操作安装xctool 安装命令:sudo brew install xctool 介绍下xctool命令: xctool

ios 自动内存管理 ARC

今天在公司爆出一个 BUG,导致5000+crash. 大致是 UIKit 中的 delegate 访问了已经释放了的界面,也就是使用了野指针导致 crash. 回来演示了一下发现 @property (nonatomic, assign) id<MyCellDelegate> delegate;//1 @property (nonatomic, weak) id<MyCellDelegate> delegate;//2 大部分的 UIKit 的 delegate 都是如1的声明

iOS 自动更新

今天要做版本的自动更新 ,我觉得其实没做这个功能的必要  但是毕竟老板是老大嘛 就敲了敲   这是看了一个大大写的  忘记谁了  抱歉哈 NSError *error; NSString *appid = @"appid"; NSString *urlStr = [NSString stringWithFormat:@"http://itunes.apple.com/lookup?id=%@",appid]; NSURL *url = [NSURL URLWithS