Jak mogę wykryć pierwsze uruchomienie
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// if very first launch than perform actionA
// else perform actionB
}
metoda?
Jak mogę wykryć pierwsze uruchomienie
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// if very first launch than perform actionA
// else perform actionB
}
metoda?
Odpowiedzi:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
return YES;
}
BOOL
. 2. Wtedy błąd jest w twoim kodzie ... jeśli zwrócenie 0 powoduje awarię, to coś jest strasznie nie tak - gdzie indziej.
NSUserDefaults
jest powszechne miejsce? co się stanie, jeśli inna aplikacja używa tego samego „klucza”, którego ja używam?
W Swift 3, 4 spróbuj tego:
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
}
}
W Swift 2 spróbuj tego,
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
}
}
AKTUALIZACJA: - W przypadku OBJ-C używam tego,
+ (BOOL)isAppAlreadyLaunchedOnce {
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isAppAlreadyLaunchedOnce"])
{
return true;
}
else
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isAppAlreadyLaunchedOnce"];
[[NSUserDefaults standardUserDefaults] synchronize];
return false;
}
}
Odniesienie do OBJ-C: https://stackoverflow.com/a/9964400/3411787
Właśnie w tym celu napisałem małą bibliotekę. Daje mi znać, czy jest to pierwsze uruchomienie w historii, czy tylko dla tej wersji i wszelkich wcześniejszych wersji zainstalowanych przez użytkownika. Jest dostępny na github jako cocoapod na licencji Apache 2: GBVersionTracking
Po prostu zadzwoń application:didFinishLaunching:withOptions:
[GBVersionTracking track];
A następnie, aby sprawdzić, czy to pierwsze uruchomienie, po prostu wywołaj to w dowolnym miejscu:
[GBVersionTracking isFirstLaunchEver];
I podobnie:
[GBVersionTracking isFirstLaunchForVersion];
[GBVersionTracking currentVersion];
[GBVersionTracking previousVersion];
[GBVersionTracking versionHistory];
dla Swift 3.0 - Swift 5
Dodaj rozszerzenie
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
}
}
następnie w swoim kodzie
UIApplication.isFirstLaunch()
Innym pomysłem na Xcode 7 i Swift 2.0 jest użycie rozszerzeń
extension NSUserDefaults {
func isFirstLaunch() -> Bool {
if !NSUserDefaults.standardUserDefaults().boolForKey("HasAtLeastLaunchedOnce") {
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "HasAtLeastLaunchedOnce")
NSUserDefaults.standardUserDefaults().synchronize()
return true
}
return false
}
}
Teraz możesz pisać w dowolnym miejscu w swojej aplikacji
if NSUserDefaults.standardUserDefaults().isFirstLaunch() {
// do something on first launch
}
Osobiście wolę takie rozszerzenie 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
}
}
Ponieważ wywołanie funkcji jest bardziej opisowe:
if UIApplication.isFirstLaunch() {
// do something on first launch
}
Możesz to zaimplementować za pomocą metody statycznej poniżej:
+ (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;
}
Musisz coś zapisać podczas uruchamiania, a następnie sprawdzić, czy istnieje. Jeśli nie, to pierwszy raz. „Coś” może być plikiem, wpisem w bazie danych, ustawieniem domyślnym użytkownika ....
Jest to dość proste i wymaga tylko sześciu wierszy kodu.
Przydatne będzie dodanie tego kodu w preferencjach uruchamiania aplikacji lub w dowolnym innym miejscu, w którym może być konieczne sprawdzenie, czy jest to pierwsze uruchomienie aplikacji.
//These next six lines of code are the only ones required! The rest is just running code when it's 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);
}
PS NIE używaj znaków bools w preferencjach Po prostu trzymaj się liczb całkowitych. Domyślnie mają wartość zero, gdy są niezdefiniowane.
Ponadto [theDefaults synchronize];
linia nie jest wymagana, ale odkryłem, że gdy aplikacja jest uruchamiana setki razy na setkach urządzeń, wyniki nie zawsze są wiarygodne, poza tym jest to lepsza praktyka.
zapisz klucz bool w NSUserDefaults za pierwszym razem, gdy będzie to nie, zmienisz go na tak i zachowasz go tak, aż aplikacja usunie lub ponownie zainstaluje ją ponownie za pierwszym razem.
Szybka i łatwa funkcja
- (BOOL) isFirstTimeOpening {
NSUserDefaults *theDefaults = [NSUserDefaults standardUserDefaults];
if([theDefaults integerForKey:@"hasRun"] == 0) {
[theDefaults setInteger:1 forKey:@"hasRun"];
[theDefaults synchronize];
return true;
}
return false;
}
Dla Swift 2.0 w Xcode 7. W pliku 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
}
}
}
szybki
struct Pref {
static let keyFirstRun = "PrefFirstRun"
static var isFirstRun: Bool {
get {
return UserDefaults.standard.bool(forKey: keyFirstRun)
}
set {
UserDefaults.standard.set(newValue, forKey: keyFirstRun)
}
}
}
Zarejestruj wartości domyślne podczas uruchamiania aplikacji:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let prefs: [String:Any] = [
Pref.keyFirstRun: true
...
]
UserDefaults.standard.register(defaults: prefs)
Wyczyść wartość po zamknięciu aplikacji:
func applicationWillTerminate(_ application: UIApplication) {
Pref.isFirstRun = false
Wartość czeku:
if Pref.isFirstRun {
... do whatever
W szybkim tempie sugerowałbym użycie stałej globalnej, którą można bardzo łatwo wykonać poza jakimkolwiek zakresem, na przykład powyżej delegata aplikacji. W związku z tym będzie ustawiona właściwa wartość, dopóki aplikacja nie zostanie zakończona. nadal będzie zwracać tę samą wartość, jeśli aplikacja przejdzie w tryb w tle. wartość zmieni się tylko wtedy, gdy aplikacja zostanie ponownie uruchomiona.
let isFirstLaunch: Bool = {
if !UserDefaults.standard.bool(forKey: "hasBeenLaunchedBeforeFlag") {
UserDefaults.standard.set(true, forKey: "hasBeenLaunchedBeforeFlag")
UserDefaults.standard.synchronize()
return true
}
return false
}()
Ale szczerze mówiąc, lepiej jest śledzić fakt, że aplikacja została przynajmniej raz wysłana do tła. W takim przypadku wolę użyć rozszerzenia na UIApplication i ustawić flagę w metodzie applicationDidEnterBackground tak, że:
extension UIApplication {
private static let isFirstLaunchKey = "isFirstLaunchKey"
static var isFirstLaunch: Bool {
return !UserDefaults.standard.bool(forKey: isFirstLaunchKey)
}
static func didEnterBackground() {
if isFirstLaunch {
UserDefaults.standard.set(true, forKey: isFirstLaunchKey)
UserDefaults.standard.synchronize()
}
}
}
a następnie w delegacie aplikacji lub delegacie sceny
func sceneDidEnterBackground(_ scene: UIScene) {
UIApplication.didEnterBackground()
}
Swift 5 iOS 13.
Lubię szybkie i łatwe Chris Fremgen . Więc zaktualizowałem to.
func isFirstTimeOpening() -> Bool {
let defaults = UserDefaults.standard
if(defaults.integer(forKey: "hasRun") == 0) {
defaults.set(1, forKey: "hasRun")
return true
}
return false
}
Zaktualizowano dla XCode 11 , Swift 5
extension UIApplication {
func isFirstLaunch() -> Bool {
if !UserDefaults.standard.bool(forKey: "HasLaunched") {
UserDefaults.standard.set(true, forKey: "HasLaunched")
UserDefaults.standard.synchronize()
return true
}
return false
}
Następnie nazywasz to jako
UIApplication.isFirstLaunch()
Najlepszym podejściem jest użycie NSUserDefaults
i zapisanie BOOL
zmiennej. Jak wspomniano powyżej, następujący kod będzie dobrze:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:[NSNumber numberWithBool:true] forKey:@"~applicationHasLaunchedBefore"];
[userDefaults synchronize];
Możesz również utworzyć makro jak poniżej, aby łatwo sprawdzić, czy jest to pierwsze uruchomienie, czy nie
#define kApplicationHasLaunchedBefore [[NSUserDefaults standardUserDefaults] objectForKey:@"~applicationHasLaunchedBefore"]
Następnie użyj go jako takiego,
if (kApplicationHasLaunchedBefore) {
//App has previously launched
} else {
//App has not previously launched
}
Oto odpowiedź działająca w Swift 5.0. Poprawa w porównaniu z odpowiedzią @Zaid Pathan polega na tym, że nie ma ukrytej umowy. Jeśli nie zadzwonisz setFirstAppLaunch()
dokładnie raz przed wywołaniem isFirstAppLaunch()
, otrzymasz błąd potwierdzenia (tylko w trybie debugowania).
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
}
Następnie wystarczy wywołać funkcję setFirstAppLaunch()
na początku aplikacji i isFirstAppLaunch()
za każdym razem, gdy chcesz sprawdzić, czy Twoja aplikacja została wywołana.