iOS 版本更新(强制更新)检测问题

12月1日更新

谢谢,@搬砖技术的提醒
需要添加些注意事项:

版本号对比是需要相同的位数的情况下的

比如:位数不同的没法比较, 比如 2.3.10与2.4.1 和 2.3.9 与 2.3.10 , 这个时候 2.3.10 应该是变成2.4.0
如果是后续需要 多位的那应该也是 2.004.001 ,补足位数,才有可比性.

5月 18日 更新

这部分是之前对比有BUG的,现在已经修复了.


Paste_Image.png

------------------------------------------------------------------------------------------

原文

通常iOS系统中是默认设置再wifi状态,且网络状况良好下自己更新应用的.
但是如果用户设置了不自动更新,但是我们的APP出现重要的版本,一定需要用户更新的情况下,就会需要这个功能了.

这个版本更新一般会有两种方式:
1.在自己的服务器上部署上一个文件,写入版本数据,然后app去获取版本数据,与自己的当前版本比对, 提示更新
优点:可自定义更新模式(强制更新,选择更新)
缺点:APP审核的时间不可控
2.去AppStore获取当前发布的版本号,与用户当前版本比对,然后提示更新.
优点:版本更新的时间精准
缺点:自定义空间小
这两种方法一般推荐第2种....
需要自定义更新模式的(强制更新,选择更新)推荐使用第一种

//第二种
/*版本更新检测
284882215 (Facebook APP ID)

//中国区,需要再.com后面加 /cn 下面已经加,测试对于外国的APP也能行

#define APP_URL @"http://itunes.apple.com/cn/lookup?id=你程序的appId"

请求网络数据,返回的大致数据如下,其他还有好多数据,我们把关键的给截取出来

{  
    resultCount = 1;  
    results =     (  
                {  
            artistId = 开发者 ID;  
            artistName = 开发者名称; 
            price = 0; 
            isGameCenterEnabled = 0;  
            kind = software;  
            languageCodesISO2A =             (  
                EN  
            ); 
            trackCensoredName = 审查名称;  
            trackContentRating = 评级;  
            trackId = 应用程序 ID;  
            trackName = 应用程序名称";  
            trackViewUrl = 应用程序介绍网址(下载地址);  
            userRatingCount = 用户评级;  
            userRatingCountForCurrentVersion = 1;  
            version = 版本号;  
            wrapperType = software; 
      }  
    );  
}  
NSString *version =  responseObject[@"results"][@"version"]; //版本号
NSString *trackViewUrl =  responseObject[@"results"][@"trackViewUrl"]; //程序下载地址
取得这些数据后关键的信息就是“ version”最新版本号和“ trackViewUrl”程序下载地址。然后与本地程序的版本比较即可。
*/
##这个你可以参照下面第一种的过程都一样

请求数据 -> 判断版本 -> 提示或不提示-> 后续操作

//第一种

你首先要去后台配置这个版本更新文件,json文件,或者txt文件也行,可配置的,(后台搞定)

在进入程序的时候 去后台接口,请求这个数据
/*
示例 josn格式
AFNetworking请求回来responseObject的格式  (请求我就不写了,这种代码烂大街咯)
{
    iosDownload = "itms-apps://itunes.apple.com/cn/app/wang-yi-yun-yin-le-pao-bufm/id590338362?mt=8";
    iosForce = 0; //控制强制更新
    iosUpdateMsg = "更新信息,哈哈哈😄";
    iosVersion = "v1.2.5";
}
*/
#pragma mark - 强制更新需要加上这个通知的监听,就是无论怎么打开 ,都会提示更新(有点流氓,慎用)
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(versionIFUpdata) name:UIApplicationDidBecomeActiveNotification object:nil];
}
 
#pragma mark - 判断版本生是否更新,如有更新,提示用户升级,的方法
-(void)versionIFUpdata
{

    //是否是强制更新
    BOOL force = [_responseObject[@"iosForce"] intValue];
    
    if (force)
    {
        [self forceUpVersion]; //强制
        
    }else
    {
        [self upVersion];  //选择
    }

}
#pragma mark - 强制更新
-(void)forceUpVersion
{

    NSString *iosDownload;
    NSString *iosVersion;
    
    BOOL force  = [_responseObject[@"iosForce"] intValue];
    iosDownload = _responseObject[@"iosDownload"];
//    iosDownload = @"itms-apps://itunes.apple.com/cn/app/wang-yi-yun-yin-le-pao-bufm/id590338362?mt=8";
    iosVersion = _responseObject[@"iosVersion"];
    //更新描述
    NSString *detail = _responseObject[@"iosUpdateMsg"];

    UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"" message:[NSString stringWithFormat:@"检测到有新版本:%@ \n该版本是重要版本,不更新将导致应用不可用 \n%@",iosVersion,detail] preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            // itms-apps://itunes.apple.com/cn/app/wang-yi-yun-yin-le-pao-bufm/id590338362?mt=8
            NSURL *url = [NSURL URLWithString:iosDownload];
            [[UIApplication sharedApplication] openURL:url];
            upDateflag = NO;
            
    }];
        
    [alertVC addAction:action1];
    [self presentViewController:alertVC animated:YES completion:nil];
}
#pragma mark - 选择更新
-(void)upVersion
{
    
    
    NSString *iosDownload;
    NSString *iosVersion;
    

    
    iosDownload = _responseObject[@"iosDownload"];
#pragma mark - 注意在这里跳转到APPstore需要URL Schemes :"itms-apps://............."
//    iosDownload = @"itms-apps://itunes.apple.com/cn/app/wang-yi-yun-yin-le-pao-bufm/id590338362?mt=8";
    iosVersion = _responseObject[@"iosVersion"];
    
//去掉其他,只保留数字
iosVersion = [[iosVersion componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet]] componentsJoinedByString:@""];

#pragma  mark -  获取当前本地的版本号
    NSDictionary *localDic =[[NSBundle mainBundle] infoDictionary];
    NSString *localVersion =[localDic objectForKey:@"CFBundleShortVersionString"];
//去掉其他,只保留数字
    localVersion = [[localVersion componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet]] componentsJoinedByString:@""];
//这里需要补齐位数,保证 版本号位数相同的情况下再进行比较 
    if(iosVersion.length != localVersion.length){
        NSInteger gap = 0;
        if(iosVersion.length > localVersion.length){
            gap = iosVersion.length - localVersion.length;
            while (gap) {
                localVersion = [localVersion stringByAppendingString:@"0"];
                gap--;
            }
        }else{
            gap = localVersion.length - iosVersion.length;
            while (gap) {
                iosVersion = [iosVersion stringByAppendingString:@"0"];
                gap--;
            }
        }
    }

  int iosVersionNum = iosVersion.intValue;
  int localVersionNum = localVersion.intValue;
     

    //更新描述
    NSString *detail = _responseObject[@"iosUpdateMsg"];
    if (localVersionNum < iosVersionNum)//如果本地版本比较低 证明要更新版本
    {

        upDateflag = YES;

        UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"更新" message:[NSString stringWithFormat:@"检测到有新版本:v%@ \n %@",iosVersion,detail] preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            // itms-apps://itunes.apple.com/cn/app/wang-yi-yun-yin-le-pao-bufm/id590338362?mt=8
            NSURL *url = [NSURL URLWithString:iosDownload];
            [[UIApplication sharedApplication] openURL:url];
            upDateflag = NO;
            
        }];
        UIAlertAction *action2 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){
            upDateflag = NO;
        }];
        [alertVC addAction:action1];
        [alertVC addAction:action2];
        [self presentViewController:alertVC animated:YES completion:nil];
        
    }

}
//如果是使用AFNetworking 请求的话,需要设置一下返回格式为JSON格式
   AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];

根据@ylyer的反馈,测试了一下 , "http://itunes.apple.com/lookup?id=我的appid&country=cn "这个样子也是可以成功的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,285评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139