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 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

参考资料:


查看作者首页

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,157评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,085评论 19 139
  • QDrive Quests Q型驱动领导力任务: Day 50 Deep Listening: Take on d...
    QDrive阅读 286评论 11 2
  • 整个五一节不在,回来后就发现短短的几天功夫我所在的城市的夏天就来了,天气一下子就变热了,而人们也一下从穿着毛衣和外...
    红袖飞扬阅读 825评论 0 2
  • “你说,你不爱种花,因为你不愿看到,看到一片片的花瓣凋落,为了避免所有的结束,你避免了所有的开始。”看到顾城的这段...
    尋水的魚阅读 334评论 0 0

友情链接更多精彩内容