對(duì)于軟件來說,當(dāng)首次啟動(dòng)軟件時(shí),應(yīng)當(dāng)有一個(gè)簡(jiǎn)單的引導(dǎo)頁(yè)面或歡迎(新特性)頁(yè)面宴霸。這些頁(yè)面可以輔助用戶清楚的了解軟件的使用或新特性,提高用戶對(duì)軟件的感觀膏蚓。
下面就是在iOS開發(fā)中使用的判斷用戶是否首次使用該App的方法:
App被發(fā)布出來后瓢谢,其版本號(hào)就是plist文件中的Bundle version所表示的值。因此驮瞧,可以通過在每次啟動(dòng)App時(shí)氓扛,對(duì)比Bundle version和上次所存儲(chǔ)的版本號(hào)數(shù)值來判斷用戶是否首次打開該App。
在AppDelegate.m中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// iOS程序啟動(dòng)完畢后论笔,創(chuàng)建的第一個(gè)視圖控件就是UIWindow采郎,接著創(chuàng)建控制器的view,最后將控制器的view添加到UIWindow上狂魔,于是控制器的view就顯示在屏幕上了蒜埋。一個(gè)iOS程序之所以能顯示到屏幕上,完全是因?yàn)樗蠻IWindow最楷。也就說理茎,沒有UIWindow,就看不見任何UI界面管嬉。使用storyboard皂林,這句代碼可以不寫,系統(tǒng)自動(dòng)創(chuàng)建window蚯撩;而純代碼編寫程序础倍,要寫此代碼,用于創(chuàng)建window胎挎。
self.window = [[UIWindow alloc] initWithFrame:kScreenFrame];
// 當(dāng)應(yīng)用啟動(dòng)時(shí)沟启,要檢測(cè)是否展示歡迎頁(yè)面或新特性控制器界面(用戶第一次使用就展示,非第一次使用就不展示)
// 1.先從Info.plist中取出版本號(hào)
// 先找到plist文件中版本號(hào)所對(duì)應(yīng)的鍵值
NSString *bundleVersionKey = (NSString *)kCFBundleVersionKey;
// 從plist文件中取出該鍵值所對(duì)應(yīng)的版本號(hào)
NSString *bundleVersion = [NSBundle mainBundle].infoDictionary[bundleVersionKey];
// 2.再?gòu)纳澈兄腥〕錾洗未鎯?chǔ)的版本號(hào)(取得到則為上次所存儲(chǔ)的版本號(hào)數(shù)值犹菇;取不到則該值為0)
NSString *saveVersion = [Storager objectForKey:bundleVersionKey];
// 3.對(duì)比這兩個(gè)版本號(hào)
if ([bundleVersion isEqualToString:saveVersion]) {// 兩個(gè)版本號(hào)一樣:非首次使用該版本德迹,直接進(jìn)入主控制器或授權(quán)頁(yè)面
if (kAccountTool.account) {// 若能獲得賬號(hào),進(jìn)入主控制器
self.window.rootViewController = [[NavigationVC alloc] initWithRootViewController:kMainVC];
}else{// 若不能獲得賬號(hào)揭芍,進(jìn)入授權(quán)頁(yè)面
self.window.rootViewController = [[NavigationVC alloc] initWithRootViewController:[[OauthController alloc] init]];
}
}else{// 兩個(gè)版本號(hào)不一樣:首次使用該版本胳搞,且將新版本號(hào)寫入沙盒存儲(chǔ)起來,供下次啟動(dòng)App時(shí)進(jìn)行版本號(hào)的讀取和對(duì)比
[Storager setObject:bundleVersion forKey:bundleVersionKey];
// 顯示新版本歡迎或新特性控制器
self.window.rootViewController = [[NewfeatureVC alloc] init];
}
// 4.將window設(shè)置為主窗口并顯示出來
[self.window makeKeyAndVisible];
return YES;
}
??? 注:Storager是存儲(chǔ)工具類,代碼如下:
Storager.h:
#import <Foundation/Foundation.h>
@interface Storager : NSObject
+(id)objectForKey:(NSString *)key;
+(void)setObject:(id)value forKey:(NSString *)key;
+(BOOL)boolForKey:(NSString *)key;
+(void)setBool:(BOOL)value forKey:(NSString *)key;
@end
Storager.m:
#import "Storager.h"
@implementation Storager
+(void)setObject:(id)value forKey:(NSString *)key
{
[kUserDefaults setObject:value forKey:key];
[kUserDefaults synchronize];
}
+(id)objectForKey:(NSString *)key
{
return [kUserDefaults objectForKey:key];
}
+(void)setBool:(BOOL)value forKey:(NSString *)key
{
[kUserDefaults setBool:value forKey:key];
[kUserDefaults synchronize];
}
+(BOOL)boolForKey:(NSString *)key
{
return [kUserDefaults boolForKey:key];
}
@end