как определить в applicationDidBecomeActive, является ли это первоначальным запуском приложения iPhone?

как определить, как определить в UIApplicationDidBecomeActiveNotification, является ли это первоначальным запуском приложения? является ли это первоначальным запуском приложения?

это первоначальный запуск приложения, в отличие от последующих DidBecomeActive из-за того, что приложение помещается в фоновый режим, а затем на передний план (например, пользователь переходит в календарь, а затем обратно в ваше приложение)


person Greg    schedule 11.10.2011    source источник


Ответы (3)


В своем applicationDidFinishLaunching:withOptions: поместите это:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"alreadyLaunched"];
[[NSUserDefaults standardUserDefaults] synchronize];

Затем в didBecomeActive:

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"alreadyLaunched"]) {
    // is NOT initial launch...
} else {
    // is initial launch...
}
person chown    schedule 11.10.2011
comment
хорошо, спасибо - нет прямого пути - я мог бы просто создать конкретную переменную экземпляра в appDelegate (скажем, логическое) для этой цели, не так ли? - person Greg; 12.10.2011
comment
Это не ответ, а работа здесь поток приложения iOS Post 4 помогает понять принятый ответ на этот вопрос - person Fotis Paraskevopoulos; 04.10.2012
comment
К сожалению, ссылка @FotisParaskevopoulos не работает. Это cocoanetics.com/files/UIApplication_Delegate_post_4_v121.jpg - person Diziet; 22.01.2013

FWIW, принятый ответ сообщает вам, запускалось ли приложение когда-либо раньше, а не возобновляется ли приложение из фонового режима по сравнению с запуском. После того, как ключ alreadyLaunched был установлен в настройках, он будет возвращать YES при запуске приложения в будущем (по сравнению с возобновлением работы в фоновом режиме).

Чтобы определить, возобновилось ли приложение из фона, вам не нужно ничего добавлять в настройки. Вместо этого выполните следующие действия в реализации делегата приложения.

// myAppDelegate.m
//

@interface MyAppDelegate()
@property (nonatomic) BOOL activatedFromBackground;
@end

@implementation MyAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.activatedFromBackground = NO;

    // your code
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    self.activatedFromBackground = YES;

    // your code
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (self.activatedFromBackground) {
        // whatever you want here
    }
}

@end
person XJones    schedule 04.03.2013

Раньше я использовал метод, упомянутый @XJones. Затем я понял, что у него есть потенциальная проблема: если «первоначальный запуск приложения» означает проверить в applicationDidBecomeActive, было ли оно вызвано в первый раз с момента запуска приложения! Потому что, когда приложение перезапускало приложение (через трамплин, переключение приложений или URL-адрес), будут вызываться все вышеперечисленные 3 метода делегата! Поэтому самый безопасный способ — сбросить self.activatedFromBackground в applicationDidBecomeActive.

person Qiulang    schedule 27.11.2013