2008-11-21 135 views

回答

80

差不多就是馬克和克里斯說,雖然我更喜歡更改值當應用程序退出時,以防需要了解該應用程序的多個區域。 在代碼:

// -applicationDidFinishLaunching: 
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],@"firstLaunch",nil]]; 
// to check it: 
[[NSUserDefaults standardUserDefaults] boolForKey:@"firstLaunch"]; 
// -applicationWillTerminate: 
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"firstLaunch"]; 
+1

卸載應用程序時,與應用程序關聯的默認數據庫中的條目是否已被刷新? – xyzzycoder 2009-12-29 22:15:32

+1

@xyzzycoder:是 – 2010-01-29 13:02:57

2

您可以在用戶的​​默認設置中設置一個布爾值來做到這一點。當您撥打registerDefaults:時將該鍵設置爲false,然後將其設置爲true,在您顯示初始幫助屏幕或您需要執行的任何操作後,將其更改爲true。

如果您在應用程序關閉後始終保存一個持久數據文件,檢查它是否存在是另一種方式。

2

保存它作爲一個user preference,如had_first_launch,設置爲在啓動時屬實,這將只能是第一次假...

29

我通常使用的應用程序的版本號,而不是在用戶默認值firstLaunch值布爾值。這樣,您可以區分第一次啓動新安裝和第一次啓動升級。可能會在未來的版本有用...

59

我意識到這個問題是相當古老的,但我用它來想出一個方法檢測第一次啓動後「全新安裝」(第一次啓動後升級/降級),並認爲我會在未來的觀衆分享代碼,以防萬一它有幫助。

// Get current version ("Bundle Version") from the default Info.plist file 
NSString *currentVersion = (NSString*)[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; 
NSArray *prevStartupVersions = [[NSUserDefaults standardUserDefaults] arrayForKey:@"prevStartupVersions"]; 
if (prevStartupVersions == nil) 
{ 
    // Starting up for first time with NO pre-existing installs (e.g., fresh 
    // install of some version) 
    [self firstStartAfterFreshInstall]; 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:currentVersion] forKey:@"prevStartupVersions"]; 
} 
else 
{ 
    if (![prevStartupVersions containsObject:currentVersion]) 
    { 
     // Starting up for first time with this version of the app. This 
     // means a different version of the app was alread installed once 
     // and started. 
     [self firstStartAfterUpgradeDowngrade]; 
     NSMutableArray *updatedPrevStartVersions = [NSMutableArray arrayWithArray:prevStartupVersions]; 
     [updatedPrevStartVersions addObject:currentVersion]; 
     [[NSUserDefaults standardUserDefaults] setObject:updatedPrevStartVersions forKey:@"prevStartupVersions"]; 
    } 
} 

// Save changes to disk 
[[NSUserDefaults standardUserDefaults] synchronize]; 
2

如果您希望在代碼的其他位置檢測到它的第一次啓動,它將無法正常工作。由於多任務處理,「applicationWillTerminate」在iOS 4.0中無法使用。 此鏈接提供了一個很好的解決方案: http://mobiledevblog.metalcompass.com/?p=43

4

這是一個非常簡單快捷,但我發現,NSUserDefault鍵值對的總是空的第一次運行一個應用程序,所以

// Check to see if its the first time 
if ([[NSUserDefaults standardUserDefaults] valueForKey:@"firstTime"] == NULL) { 
    [[NSUserDefaults standardUserDefaults] setValue:@"Not" forKey:@"firstTime"]; 
} 

,並把這個代碼在應用程序啓動時顯示的視圖控制器的awakeFromNib中。我不知道其他答案是否適用於您的問題,但這是我解決問題的方式。

相關問題