iOS自动检测版本更新
虽然苹果官方是不允许应用自动检测更新,提示用户下载,因为苹果会提示你有多少个软件需要更新,但是有的时候提示用户一下有新版还是很有必要的。
首先说一下原理:
每个上架的苹果应用程序,都会有一个应用程序的ID,根据这个ID我们就可以获取到当前程序的最新版本号,然后和自己的版本号作比较,如果一样的话就是最新版,反之就不是新版,就可以提示用户来手动下载最新版的程序。因为有ID所以就可以定位到这个APP,点击下载即可。
源码:
一般建议检测更新的代码放到主页控制器里。
首先还要导入一个头文件用来打开AppStore下载更新
//AppStore
#import <StoreKit/StoreKit.h>
接着还有代理
SKStoreProductViewControllerDelegate
然后开始检测更新
//检测版本,版本更新
NSError *error;
NSString *urlStr = @"http://itunes.apple.com/lookup?id=上架AppID";
NSURL *url = [NSURL URLWithString:urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSDictionary *appInfoDict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
if (error)
{
return;
}
NSArray *resultArray = [appInfoDict objectForKey:@"results"];
if (![resultArray count])
{
return;
} NSDictionary *infoDict = [resultArray objectAtIndex:];
//获取服务器上应用的最新版本号
NSArray* arr=[infoDict[@"version"] componentsSeparatedByString:@"."];
NSInteger updateVersion=;
for (int i=; i<arr.count; i++)
{
if(i==)
{
updateVersion+=[arr[i] integerValue]*;
}
else if (i==)
{
updateVersion+=[arr[i] integerValue]*;
}
else if (i==)
{
updateVersion+=[arr[i] integerValue]*;
}
else if (i==)
{
updateVersion+=[arr[i] integerValue]*;
}
}
NSString *trackName = infoDict[@"trackName"];
_trackViewUrl = infoDict[@"trackViewUrl"];
//获取当前设备中应用的版本号
NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
NSArray* arr2=[[infoDic objectForKey:@"CFBundleShortVersionString"] componentsSeparatedByString:@"."];
NSInteger currentVersion=; for (int i=; i<arr2.count; i++)
{
if(i==)
{
currentVersion+=[arr2[i] integerValue]*;
}
else if (i==)
{
currentVersion+=[arr2[i] integerValue]*;
}
else if (i==)
{
currentVersion+=[arr2[i] integerValue]*;
}
else if (i==)
{
currentVersion+=[arr2[i] integerValue]*;
}
} //判断两个版本是否相同
if (currentVersion < updateVersion)
{
NSString *titleStr = [NSString stringWithFormat:@"检查更新:%@", trackName];
NSString *messageStr = [NSString stringWithFormat:@"发现新版本%@,是否更新", infoDict[@"version"]];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:titleStr message:messageStr delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"升级", nil];
//为了区分其他弹出框而已
alert.tag = ;
[alert show]; }
接着就是用户更不更的问题了
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (alertView.tag == )
    {
        if (buttonIndex == )
        {
            //点击”升级“按钮,就从打开app store上应用的详情页面
            SKStoreProductViewController *storeProductVC = [[SKStoreProductViewController alloc] init];
            storeProductVC.delegate = self;
            NSDictionary *dict = [NSDictionary dictionaryWithObject:@"上架AppID" forKey:SKStoreProductParameterITunesItemIdentifier];
            [storeProductVC loadProductWithParameters:dict completionBlock:^(BOOL result, NSError *error)
             {
                 if (result)
                 {
                     [self presentViewController:storeProductVC animated:YES completion:nil];
                 }
             }];
        }
    }
}
还有就是用户打开AppStore但是没有下载就返回回来的状况
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController
{
[viewController dismissViewControllerAnimated:YES completion:nil];
}
OK到这里就结束了。这样的话就可以检测App是不是最新版了,而且用户也能实时看到,最关键的是苹果审核还能通过。
iOS自动检测版本更新的更多相关文章
- iOS开发 检测版本更新
		
iOS开发 检测版本更新的实现 苹果给了我们一个接口,能根据应用id请求一些关于应用的信息.我们可以根据返回的信息,来判断版本是否和应用的版本一致,如果不一致,那么就出现新的版本了.这时,就需要向用户 ...
 - iOS内存泄漏自动检测工具PLeakSniffer
		
新款objective-C内存泄漏自动检测工具 PLeakSniffer , GitHub地址 (https://github.com/music4kid/PLeakSniffer). 背景 前些天读 ...
 - iOS子线程操作检测版本更新,有新版本通知用户更新, CheckVersion
		
iOS子线程操作检测版本更新,有新版本通知用户更新 CheckVersion 一:如何使用: #import "CheckVersion.h" //输入你的app在appStore ...
 - iOS 检测版本更新(02)
		
iOS 检测版本更新 如果我们要检测app版本的更新,那么我们必须获取当前运行app版本的版本信息和appstore 上发布的最新版本的信息. 当前运行版本信息可以通过info.plist文件中的bu ...
 - IOS开发中如何实现自动检测更新APP
		
自动检测更新实现逻辑: 先上github地址:https://github.com/wolfhous/HSUpdateApp 1,获取当前项目APP版本号 2,拿到AppStore项目版本号 3,对比 ...
 - 检测版本更新,iOS
		
检测版本更新的方法. //检查新版本 更新 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^ ...
 - iOS 覆盖率检测原理与增量代码测试覆盖率工具实现
		
背景 对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久.如果在开发.测试阶段能够提前暴露问题,就有助于避免线上事故的发生.代码覆盖率检测正是帮助开发.测试同学提前发现 ...
 - 上传IOS项目和版本更新流程图
		
上传IOS项目和版本更新流程图 必备IDP证书和distribution证书(第一个证书是真机部署测试时用到的,后者证书是发布时需要用到的,缺一不可). 我就说说接下来应该做的流程.在你保证拥有以上两 ...
 - 【译】Spring 4 自动装配、自动检测、组件扫描示例
		
前言 译文链接:http://websystique.com/spring/spring-auto-detection-autowire-component-scanning-example-with ...
 
随机推荐
- Mac OS sierra app is damaged
			
想升级系统,然后发生如题错误,谷歌之,解决方法如下(希望帮助大家): Step 1. Go to your applications folder. Step 2. Find the installe ...
 - oracle---包--laobai
			
包(package) 作用:逻辑对象的一种.对相关存储过程.函数.变量的封装. a 封装,便于调用 b 统一授权 系统内置包:dbms_output.用于输出. standard:常用的函数.异常的定 ...
 - matlab 曲线拟合
			
曲线拟合(转载:http://blog.sina.com.cn/s/blog_8e1548b80101c9iu.html) 补:拟合多项式输出为str 1.poly2str([p],'x') 2. f ...
 - java 在循环中删除数组元素
			
在写代码中经常会遇到需要在数组循环中删除数组元素的情况,但删除会导致数组长度变化. package com.fortunedr.thirdReport; import java.util.ArrayL ...
 - 几种常见的Shell
			
Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把它们称作一种Shell.我们常说有多少种Shell,其实说的是Shell脚本解释器. bash bash是L ...
 - ReportServices如何在一页中将报表分成两列显示
			
创建两个数据集 DataSet1 DataSet2 DataSet1 SELECT TOP (SELECT (COUNT(*) + 1) / 2 A ...
 - 记录分享公司Spring data相关配置
			
起因 公司Spring Data相关的配置还是有点意思的,不过蛮复杂的...XML很多...我不太喜欢强行记住....所以我打算记录一下配置的大致思路和结构,以后可能会有用.... 总体结构 总体结构 ...
 - 深入理解javascript原型和闭包 (转)
			
该教程绕开了javascript的一些基本的语法知识,直接讲解javascript中最难理解的两个部分,也是和其他主流面向对象语言区别最大的两个部分--原型和闭包,当然,肯定少不了原型链和作用域链.帮 ...
 - Stm32F107VCT6硬件资源
			
一直在用stm32系列的单片机,最近因为需要使用到以太网,所以采用了stm32f107vc这款芯片.对于存储资源一直不是非常清楚,今天专门到官网看了一下. 如下: RAM------>64kB ...
 - 关于GridView中控件的问题
			
最近做项目报表时,会遇到在Gridview中有一些控件,报表中也会有更新.删除等一系列的操作,但往往会遇到一些控件取值取不到或者找不到控件得问题,通过网上查阅资料对其中的一些做一总结: 前台代码如下: ...