摘要:
我们每天在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