Я хочу проверить, работает ли мое приложение iPhone в первый раз. Я могу создать файл в папке документов и проверить этот файл, чтобы убедиться, что это приложение в первый раз, но я хотел знать, есть ли лучший способ сделать это.
Лучший способ проверить, работает ли iPhone приложение в первый раз
Ответ 1
Мне нравится использовать NSUserDefaults для хранения показаний первого запуска.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults objectForKey:@"firstRun"])
[defaults setObject:[NSDate date] forKey:@"firstRun"];
[[NSUserDefaults standardUserDefaults] synchronize];
Затем вы можете проверить его позже...
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([defaults objectForKey:@"firstRun"])
{
// do something or not...
}
Ответ 2
Хорошо, что меня смущает про пользовательские настройки по умолчанию.
ГДЕ они хранятся?
- Вы не заботитесь о том, что это зависит от iOS/Mac.
- вы просто получаетеVALUE by KEY
- setVALUE by KEY + синхронизация
- iOS/Mac делает все остальное.
Это общий прецедент: Проверка наличия значения, например firstRun. В первый раз, когда он НЕ СУЩЕСТВУЕТ, обычно следует установить значение. 2-й запуск - в следующем цикле он существует, и запускается другой прецедент /else stmt
----.h
@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
//flag to denote if this is first time the app is run
@property(nonatomic) BOOL firstRun;
------.m
@implementation MyAppDelegate
@synthesize firstRun = _firstRun;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//==============
//Check to see if this is first time app is run by checking flag we set in the defaults
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults objectForKey:@"firstRun"]){
//flag doesnt exist then this IS the first run
self.firstRun = TRUE;
//store the flag so it exists the next time the app starts
[defaults setObject:[NSDate date] forKey:@"firstRun"];
}else{
//flag does exist so this ISNT the first run
self.firstRun = FALSE;
}
//call synchronize to save default - where its saved is managed by iOS - varies by device and iOS/Mac
[[NSUserDefaults standardUserDefaults] synchronize];
//TO TEST: delete the app on the device/simulator
//run it - should be the first run
//close it - make sure you kill it and its not just in the background else didFinishLaunchingWithOptions wont be called
//just applicationDidBecomeActive
//2nd run it should self.firstRun = FALSE;
//=============
//ПРИМЕЧАНИЕ. ВАЖНО, ЕСЛИ YOUR ROOTVIEWCONTROLLER проверяет appDelegate.firstRun, тогда убедитесь, что вы сделали чек выше ПЕРЕД настройкой self.window.rootViewController здесь
self.window.rootViewController = self.navController;
[self.window makeKeyAndVisible];
return YES;
}
---- ИСПОЛЬЗОВАНИЕ ФЛАГА
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
if (appDelegate.firstRun){
NSLog(@"IS FIRST RUN - Do something: e.g. set up password");
}else {
NSLog(@"FPMyMusicScreenViewController: IS NOT FIRST RUN - Prompt for password");
}
Приведенные выше примеры немного смутили меня, поскольку они показывают, как проверить его в первый раз, но затем упомянуть, как "проверить его позже" в том же комментарии. Проблема в том, что, когда мы находим, что он не существует, мы немедленно создаем его и синхронизируем. Таким образом, проверка на наличие этого опоздания на самом деле означает, что при повторном запуске APP не выполняется тот же запуск, что и в первом запуске.
Ответ 3
В вашем делете делегата зарегистрируйте значение по умолчанию:
NSDictionary *defaultsDict =
[[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"FirstLaunch", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDict];
[defaultsDict release];
Затем, где вы хотите его проверить:
NSUserDefaults *sharedDefaults = [NSUserDefaults standardUserDefaults];
if ([sharedDefaults boolForKey:@"FirstLaunch"]) {
//Do the stuff you want to do on first launch
[sharedDefaults setBool:NO forKey:@"FirstLaunch"];
[sharedDefaults synchronize];
}
Ответ 4
Вы можете реализовать его со статическим методом ниже. Я думаю, это лучше, так как вы можете назвать этот метод столько раз, сколько хотите, в отличие от других решений. наслаждайтесь: (Имейте в виду, что он не является потокобезопасным)
+ (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;
}
Ответ 5
Вы можете использовать специальный метод категорий isFirstLaunch с UIViewController + FirstLaunch.
- (BOOL)isFirstLaunch
{
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"kFirstLaunch"]) {
return YES;
}
else {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"kFirstLaunch"];
[[NSUserDefaults standardUserDefaults] synchronize];
return NO;
}
}
И когда вам нужно использовать его в контроллере
BOOL launched = [self isFirstLaunch];
if (launched) {
//if launched
}
else {
//if not launched
}
Ответ 6
Используйте NSUserDefaults. Если у sharedDefault есть ключ для вашего приложения, его запуск выполняется раньше. Конечно, при первом запуске приложения вам нужно будет создать хотя бы одну запись по умолчанию.
Ответ 7
Swift:
var isFirstLaunch: Bool {
get {
if (NSUserDefaults.standardUserDefaults().objectForKey("firstLaunchDate") == nil) {
NSUserDefaults.standardUserDefaults().setObject(NSDate(), forKey: "firstLaunchDate")
NSUserDefaults.standardUserDefaults().synchronize()
return true
}
return false
}
}
Другой совет:
При использовании NSUserDefaults эти параметры будут удалены, если приложение будет удалено. Если по какой-то причине вам нужно, чтобы эти настройки все еще зависали, вы можете сохранить их в цепочке ключей.