每个程序都会多个版本,每个版本的功能会进一步优化或调整,将这些功能简明扼要的展示给急于尝鲜的用户,这就是版本新特性的功能。
程序第一次安装或升级之后的第一次启动,都会出现三到四页功能介绍页面,划屏浏览,然后才是正式进入程序。同版本的程序二次启动则没有这些介绍页。这就是版本新特性现实界面。
如何实现这个功能呢?
需求:第一次安装或版本升级,显示新特性;同版本第二次进入,不显示新特性。
分析:程序启动会显示不同界面,就是window加载的根控制器rootViewController是不相同的。如何让一个程序启动的时候,有选择性的加载不同控制器呢?简单,if语句判断一下就解决了。那么if的判断条件是什么呢?这里牵扯的是版本,自然是版本号了。
比较版本号,决定显示哪个控制器。
比较哪里的版本号呢?比较当前运行程序的版本号和程序沙盒中存储的版本号。这里分以下三种情况:
第一次运行该程序,程序沙盒根本没有保存版本号。当前程序版本号 > 沙盒中版本号:显示新特性。
程序升级了,当前程序版本号 > 沙盒中版本号:显示新特性。(升级,版本号肯定变大。没见过升级版本号还变小的)
非首次运行该程序,沙盒中已保存版本号。当前程序版本号 = 沙盒中版本号:不显示新特性。
具体思路流程:
代码实现:
// 创建window,大小等于屏幕大小
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// 获取当前程序的info.plist中的Bundle version版本号,和沙盒中的版本号比较。
// info.plist中版本号的键值
NSString *key = (__bridge NSString *)kCFBundleVersionKey;
// 当前软件版本号
NSString *newEditionNum = [NSBundle mainBundle].infoDictionary[key];
// 沙盒中的版本号
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *sandBoxEditionNum = [defaults stringForKey:key];
// 比较两者的大小
if ([newEditionNum compare:sandBoxEditionNum] == NSOrderedDescending) {
// 当前版本号存储到沙盒
[defaults setObject:newEditionNum forKey:key];
// 同步写入
[defaults synchronize];
//根控制器为新特性控制器
self.window.rootViewController = [[XDEditionViewController alloc] init];
}else{
//根控制器为tabBarController
self.window.rootViewController = [[XDTabBarController alloc] init];
}
// 显示window
[self.window makeKeyAndVisible];