Как я могу обнаружить самый первый запуск
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// if very first launch than perform actionA
// else perform actionB
}
метод?
Как я могу обнаружить самый первый запуск
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// if very first launch than perform actionA
// else perform actionB
}
метод?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
return YES;
}
В 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
}
}
В 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
}
}
ОБНОВЛЕНИЕ: - Для OBJ-C я использую это,
+ (BOOL)isAppAlreadyLaunchedOnce {
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isAppAlreadyLaunchedOnce"])
{
return true;
}
else
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isAppAlreadyLaunchedOnce"];
[[NSUserDefaults standardUserDefaults] synchronize];
return false;
}
}
Ссылка на OBJ-C: fooobar.com/questions/41917/...
Я написал крошечную библиотеку для этой цели. Это позволяет мне узнать, является ли это первым запуском за всю историю, или только для этой версии, и для любых предыдущих версий, которые пользователь установил. Он доступен на github как cocoapod под лицензией Apache 2: GBVersionTracking
Вы просто вызываете это в application:didFinishLaunching:withOptions:
[GBVersionTracking track];
И затем, чтобы проверить, является ли это первым запуском, просто вызывайте это где угодно:
[GBVersionTracking isFirstLaunchEver];
И аналогично:
[GBVersionTracking isFirstLaunchForVersion];
[GBVersionTracking currentVersion];
[GBVersionTracking previousVersion];
[GBVersionTracking versionHistory];
Вы можете реализовать его со статическим методом ниже:
+ (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;
}
Еще одна идея для 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
}
}
Теперь вы можете писать где угодно в своем приложении
if NSUserDefaults.standardUserDefaults().isFirstLaunch() {
// do something on first launch
}
Я лично предпочитаю расширение 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
}
}
Поскольку вызов функции более описателен:
if UIApplication.isFirstLaunch() {
// do something on first launch
}
для быстрого 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
}
}
то в вашем коде
UIApplication.isFirstLaunch()
Вам нужно что-то сэкономить при запуске, а затем проверить, существует ли он. Если нет, то это первый раз. "Что-то" может быть файлом, записью базы данных, настройкой по умолчанию для пользователей....
Это довольно просто сделать, и требуется всего шесть строк кода.
Полезно добавить этот код в настройки запуска приложения или где-нибудь еще, что вам может потребоваться, чтобы проверить, было ли это в первый раз, когда ваше приложение было запущено.
//These next six lines of code are the only ones required! The rest is just running code when it the first time.
//Declare an integer and a default.
NSUserDefaults *theDefaults;
int launchCount;
//Set up the properties for the integer and default.
theDefaults = [NSUserDefaults standardUserDefaults];
launchCount = [theDefaults integerForKey:@"hasRun"] + 1;
[theDefaults setInteger:launchCount forKey:@"hasRun"];
[theDefaults synchronize];
//Log the amount of times the application has been run
NSLog(@"This application has been run %d amount of times", launchCount);
//Test if application is the first time running
if(launchCount == 1) {
//Run your first launch code (Bring user to info/setup screen, etc.)
NSLog(@"This is the first time this application has been run";
}
//Test if it has been run before
if(launchCount >= 2) {
//Run new code if they have opened the app before (Bring user to home screen etc.
NSLog(@"This application has been run before);
}
P.S. НЕ использовать bools в настройках Просто придерживайтесь целых чисел. Они по умолчанию равны нулю, когда undefined.
Кроме того, строка [theDefaults synchronize];
не требуется, но я обнаружил, что, когда приложение запускается сотни раз на сотни устройств, результаты не всегда надежны, кроме того, это лучше.
Хранить ключ bool в NSUserDefaults в первый раз, когда он не будет, вы измените его на yes и сохраните его так, как только приложение удалит или переустановит его снова в первый раз.
Для Swift 2.0 в Xcode 7. В файле AppDelegate.swift:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool
{
return true
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
didFinishLaunchingOnce()
return true
}
func didFinishLaunchingOnce() -> Bool
{
let defaults = NSUserDefaults.standardUserDefaults()
if let hasBeenLauncherBefore = defaults.stringForKey("hasAppBeenLaunchedBefore")
{
//print(" N-th time app launched ")
return true
}
else
{
//print(" First time app launched ")
defaults.setBool(true, forKey: "hasAppBeenLaunchedBefore")
return false
}
}
}
Быстрая и простая функция
- (BOOL) isFirstTimeOpening {
NSUserDefaults *theDefaults = [NSUserDefaults standardUserDefaults];
if([theDefaults integerForKey:@"hasRun"] == 0) {
[theDefaults setInteger:1 forKey:@"hasRun"];
[theDefaults synchronize];
return true;
}
return false;
}
Лучший подход - использовать NSUserDefaults
и сохранить переменную BOOL
.
Как уже упоминалось выше, следующий код будет очень хорош:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:[NSNumber numberWithBool:true] forKey:@"~applicationHasLaunchedBefore"];
[userDefaults synchronize];
Вы также можете создать макрос, как показано ниже, чтобы легко проверить, является ли это первым запуском или нет
#define kApplicationHasLaunchedBefore [[NSUserDefaults standardUserDefaults] objectForKey:@"~applicationHasLaunchedBefore"]
Затем используйте его как таковой,
if (kApplicationHasLaunchedBefore) {
//App has previously launched
} else {
//App has not previously launched
}
Вот ответ, работающий в Swift 5.0. Улучшение по сравнению с ответом @Zaid Pathan в том, что нет скрытого контракта. Если вы не вызываете setFirstAppLaunch()
ровно один раз перед вызовом isFirstAppLaunch()
вы получите ошибку подтверждения (только в режиме отладки).
fileprivate struct _firstAppLaunchStaticData {
static var alreadyCalled = false
static var isFirstAppLaunch = true
static let appAlreadyLaunchedString = "__private__appAlreadyLaunchedOnce"
}
func setFirstAppLaunch() {
assert(_firstAppLaunchStaticData.alreadyCalled == false, "[Error] You called setFirstAppLaunch more than once")
_firstAppLaunchStaticData.alreadyCalled = true
let defaults = UserDefaults.standard
if defaults.string(forKey: _firstAppLaunchStaticData.appAlreadyLaunchedString) != nil {
_firstAppLaunchStaticData.isFirstAppLaunch = false
}
defaults.set(true, forKey: _firstAppLaunchStaticData.appAlreadyLaunchedString)
}
func isFirstAppLaunch() -> Bool {
assert(_firstAppLaunchStaticData.alreadyCalled == true, "[Error] Function setFirstAppLaunch wasn't called")
return _firstAppLaunchStaticData.isFirstAppLaunch
}
Тогда вам просто нужно вызвать функцию setFirstAppLaunch()
в начале вашего приложения и isFirstAppLaunch()
всякий раз, когда вы хотите проверить, было ли isFirstAppLaunch()
ваше приложение.
быстрый
struct Pref {
static let keyFirstRun = "PrefFirstRun"
static var isFirstRun: Bool {
get {
return UserDefaults.standard.bool(forKey: keyFirstRun)
}
set {
UserDefaults.standard.set(newValue, forKey: keyFirstRun)
}
}
}
Зарегистрируйте значения по умолчанию при запуске приложения:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let prefs: [String:Any] = [
Pref.keyFirstRun: true
...
]
UserDefaults.standard.register(defaults: prefs)
Очистить значение при завершении приложения:
func applicationWillTerminate(_ application: UIApplication) {
Pref.isFirstRun = false
Проверьте значение:
if Pref.isFirstRun {
... do whatever