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

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

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

ios更新界面 ios软件更新界面_iOS版本更新提示

简单整理了思考思路,如图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