如何在iPhone上检测首次启动应用程序

isc*_*ers 161 iphone launch launching-application ios

我怎样才能检测到第一次发布

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  // if very first launch than perform actionA
  // else perform actionB
}
Run Code Online (Sandbox Code Playgroud)

方法?

小智 382

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
    {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

  • @ZivLevy不,用户默认值存储在每个沙箱(=每个应用程序)的属性列表中. (6认同)
  • 它仅适用于之前从未提交过的新应用. (2认同)

Zai*_*han 35

Swift 3,4中试试这个:

func isAppAlreadyLaunchedOnce()->Bool{
        let defaults = UserDefaults.standard

        if let isAppAlreadyLaunchedOnce = defaults.string(forKey: "isAppAlreadyLaunchedOnce"){
            print("App already launched : \(isAppAlreadyLaunchedOnce)")
            return true
        }else{
            defaults.set(true, forKey: "isAppAlreadyLaunchedOnce")
            print("App launched first time")
            return false
        }
    }
Run Code Online (Sandbox Code Playgroud)

Swift 2试试这个,

func isAppAlreadyLaunchedOnce()->Bool{
    let defaults = NSUserDefaults.standardUserDefaults()

    if let isAppAlreadyLaunchedOnce = defaults.stringForKey("isAppAlreadyLaunchedOnce"){
        print("App already launched : \(isAppAlreadyLaunchedOnce)")
        return true
    }else{
        defaults.setBool(true, forKey: "isAppAlreadyLaunchedOnce")
        print("App launched first time")
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

更新: -对于OBJ-C我使用这个,

+ (BOOL)isAppAlreadyLaunchedOnce {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isAppAlreadyLaunchedOnce"])
    {
        return true;
    }
    else
    {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isAppAlreadyLaunchedOnce"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

参考OBJ-C:https://stackoverflow.com/a/9964400/3411787


lms*_*lms 32

我为此目的写了一个小图书馆.它让我知道这是第一次启动,还是仅适用于此版本,以及用户安装的任何过去版本.它可以在github上作为Apache 2许可证下的cocoapod:GBVersionTracking

你只需要打电话给我 application:didFinishLaunching:withOptions:

[GBVersionTracking track];
Run Code Online (Sandbox Code Playgroud)

然后检查这是否是第一次启动只是在任何地方调用它:

[GBVersionTracking isFirstLaunchEver];
Run Code Online (Sandbox Code Playgroud)

同样地:

[GBVersionTracking isFirstLaunchForVersion];

[GBVersionTracking currentVersion];
[GBVersionTracking previousVersion];
[GBVersionTracking versionHistory];
Run Code Online (Sandbox Code Playgroud)

  • @StianHøilandGBToolbox依赖关系消失了,库附带了podspec(发布到CocoaPods specs repo). (4认同)

Mat*_*Bot 8

您可以使用下面的静态方法实现它:

+ (BOOL)isFirstTime{
    static BOOL flag=NO;
    static BOOL result;

    if(!flag){
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"hasLaunchedOnce"]){
            result=NO;
        }else{
            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasLaunchedOnce"];
            [[NSUserDefaults standardUserDefaults] synchronize];
            result=YES;
        }

        flag=YES;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道,但这种方法不是.2当标志为NO时,线程可以到达if(!flag){ 他们会进入if块.其中一个将进入内部else并设置NSUserDefaults,第二个将传递"hasLaunchOnce"(因为第一个线程声明了它)并将结果设置为NO.这意味着你可以得到错误的价值. (9认同)

den*_*tra 8

Xcode 7和Swift 2.0的另一个想法是使用扩展

extension NSUserDefaults {
    func isFirstLaunch() -> Bool {
        if !NSUserDefaults.standardUserDefaults().boolForKey("HasAtLeastLaunchedOnce") {
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "HasAtLeastLaunchedOnce")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在应用中的任何位置书写

if NSUserDefaults.standardUserDefaults().isFirstLaunch() {
    // do something on first launch
}
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢UIApplication的扩展,如下所示:

extension UIApplication {
    class func isFirstLaunch() -> Bool {
        if !NSUserDefaults.standardUserDefaults().boolForKey("HasAtLeastLaunchedOnce") {
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "HasAtLeastLaunchedOnce")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

因为函数调用更具描述性:

if UIApplication.isFirstLaunch() {
    // do something on first launch
}
Run Code Online (Sandbox Code Playgroud)


KIO*_*KIO 7

对于swift 3.0

添加扩展名

    extension UIApplication {
        class func isFirstLaunch() -> Bool {
            if UserDefaults.standard.bool(forKey: "hasBeenLaunchedBeforeFlag") {
                UserDefaults.standard.set(true, forKey: "hasBeenLaunchedBeforeFlag")
                UserDefaults.standard.synchronize()
                return true
            }
            return false
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中

UIApplication.isFirstLaunch()
Run Code Online (Sandbox Code Playgroud)

  • 如果您在应用程序中的多个位置请求它,那么对于第二个和后续请求,它将返回 FALSE,尽管它实际上可能是第一次运行。最好使用发射计数器 (2认同)

Phi*_*lls 5

您需要在启动时保存一些内容,然后检查它是否存在.如果没有,这是第一次."Something"可以是文件,数据库条目,用户默认设置....