iOS 版本更新提示、新特性启动页面思路 —— HERO博客

简单整理iOS开发中,面对版本更新提示、新特性启动页面时的思考思路。

首先认清两者区别,版本更新的提示可能只要版本变动就会提示需要重复提醒。而新特性页面可能只出现在比较大的版本更新中,通常只显示一次。所以需要分开进行判断,根据各自的需求设计代码。

还有需要注意的一点,iOS系统不同于安卓,home键退出程序后,除非手动关闭程序,不然程序会一直保留在后台,启动在后台的app和已关闭的app会进入AppDelegate不同的方法中,需要在对应的方法中分别设计代码。


简单整理了思考思路,如图12-1。

分析逻辑之前简述一下上图的判断中共用到了3个不同的版本号,分别是:

App Store 中应用的版本号:提交版本苹果审核之后,苹果商城可以看到提供下载使用的版本号。

当前软件的版本号:Info中的Bundle version,开发者提交新版本时手动填写,用户下载新版本后自动更新为苹果商城的版本号。

本地持久化的版本号:手动存储在沙盒中,记录最新版本。

在新打开app的时候会进入到AppDelegate的didFinishLaunchingWithOptions的方法中,首先判断苹果商城和当前软件的版本号,如果苹果商城的版本号更高,说明有新版本,显示新版本更新提示,由用户选择是否更新。反之,苹果商城没有新版本,再判断当前软件和本地的版本号,如果当前软件的版本号更高,显示版本新特性页面,然后保存新的版本号到本地。

由后台打开进入app时会调用AppDelegate的applicationWillEnterForeground的方法中,判断苹果商城和当前软件的版本号,查看是否有版本更新。

下面贴一下相关代码,部分代码并不完善,仅供学习参考:

@implementation AppDelegate

static NSString * const key = @"CFBundleVersion";

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    //appStore新版本检测
    NSString *url = [[NSString alloc] initWithFormat:@"http://itunes.apple.com/lookup?id=%@", @"1037684"];
    [self Postpath:url];
    
    //获得当前软件的版本号
    NSString *currentVersion = [NSBundle mainBundle].infoDictionary[key];
    
    //取出沙盒中存储的上次使用软件的版本号
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *lastVersion = [defaults stringForKey:key];
    
    //以1.3.0格式为列,判断前3个字符,小更新最后1位改变没有新特性显示
    NSString *str1 = [currentVersion substringToIndex:3];
    NSString *str2 = [lastVersion substringToIndex:3];
    
    if ([str1 isEqualToString:str2]) {
        self.window.rootViewController = [[AViewController alloc] init];
    }else {
        //新版本
        self.window.rootViewController = [[BViewController alloc] init];
        //存储新版本
        [defaults setObject:currentVersion forKey:key];
        [defaults synchronize];
    }
    
    return YES;
}

//进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application {
    
    // appStore新版本检测
    NSString *url = [[NSString alloc] initWithFormat:@"http://itunes.apple.com/lookup?id=%@",@"1037684"];
    [self Postpath:url];
}

-(void)Postpath:(NSString *)path
{
    NSURL *url = [NSURL URLWithString:path];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                           cachePolicy:NSURLRequestReloadIgnoringCacheData
                                                       timeoutInterval:10];
    [request setHTTPMethod:@"POST"];
    
    NSOperationQueue *queue = [NSOperationQueue new];
    
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response,NSData *data,NSError *error) {
        NSMutableDictionary *receiveStatusDic = [[NSMutableDictionary alloc] init];
        
        if (data) {
            NSDictionary *receiveDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
            
            if ([[receiveDic valueForKey:@"resultCount"] intValue] > 0) {
                [receiveStatusDic setValue:@"1" forKey:@"status"];
                [receiveStatusDic setValue:[[[receiveDic valueForKey:@"results"] objectAtIndex:0] valueForKey:@"version"] forKey:@"version"];
                
            }else {
                [receiveStatusDic setValue:@"-1" forKey:@"status"];
            }
            
        }else {
            [receiveStatusDic setValue:@"-1" forKey:@"status"];
        }
        
        [self performSelectorOnMainThread:@selector(receiveData:) withObject:receiveStatusDic waitUntilDone:NO];
    }];
}

- (void)receiveData:(NSMutableDictionary *)receiveStatusDic
{
    //appStore版本号
    NSString *appStoreVersion = [receiveStatusDic objectForKey:@"version"];
    //获得当前软件的版本号
    NSString *currentVersion = [NSBundle mainBundle].infoDictionary[key];

    NSString *str1 = [appStoreVersion stringByReplacingOccurrencesOfString:@"." withString:@""];
    NSString *str2 = [currentVersion stringByReplacingOccurrencesOfString:@"." withString:@""];
    
    //新版本
    if ([str2 intValue] < [str1 intValue]) {
       //show alertView ...
    }
}

@end


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值