web-dev-qa-db-ja.com

iOSアプリの初回起動を検出しますか?

IOSアプリが初めて起動されたときにどのように検出しますか?

64
Steph Thirion

MarcとChrisが言ったことはほとんど同じですが、アプリケーションの複数の領域について知っておく必要がある場合に備えて、アプリケーションが終了したときに値を変更することを好みます。コードで:

Objective-C

// -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"];

Swift 5.

// -applicationDidFinishLaunching:
UserDefaults.standard.register(defaults: ["firstLaunch":true])
// to check it:
UserDefaults.standard.bool(forKey: "firstLaunch")
// -applicationWillTerminate:
UserDefaults.standard.set(false, forKey: "firstLaunch")
82

私はこの質問がかなり古いことに気づきましたが、「新規インストール」後の最初の起動(アップグレード/ダウングレード後の最初の起動に対して)を検出するoneメソッドを思いついたので、私はそれを考えました。それが役立つ場合に備えて、将来の視聴者のためにここでコードを共有します。

// 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];
59
Clint Harris

私は通常、ユーザーのデフォルトのfirstLaunch値にブール値の代わりにアプリのバージョン番号を使用します。これにより、新規インストールの初回起動とアップグレードの初回起動を区別できます。将来のバージョンで役立つかもしれません...

29
Daniel

これは本当に簡単なショートカットですが、アプリを初めて実行するときは、NSUserDefaultのキーと値のペアが常にNULLであることがわかりました。

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

このコードを、アプリケーションの起動時に表示されるビューコントローラーのawakeFromNibに配置します。他の回答があなたの問題に有効かどうかはわかりませんが、これが私が解決した方法です。

4
NSCoder

これを行うには、ユーザーのデフォルトでブール値を設定できます。 registerDefaults:を呼び出すときにキーをfalseに設定し、それをtrueに設定して、最初のヘルプ画面または必要な操作をすべて表示した後で、trueに変更します。

アプリを閉じた後も常に保存される永続的なデータファイルがある場合、それが存在するかどうかを確認することは別の方法です。

2

これを ユーザー設定 として保存します。たとえば、had_first_launchを起動時にtrueに設定します。初回のみfalseになります...

2
Chris Kimpton

これは、コードの他の場所で最初に起動したかどうかを検出したい場合、正しく機能しません。 「applicationWillTerminate」は、マルチタスクのため、iOS 4.0からは機能しません。このリンクは良い解決策を提供します: http://mobiledevblog.metalcompass.com/?p=4

2
MCO