2009-11-02 25 views
32

मैं यह देखना चाहता हूं कि मेरा आईफोन ऐप पहली बार चल रहा है या नहीं। मैं दस्तावेज़ फ़ोल्डर में एक फाइल बना सकता हूं और यह देखने के लिए कि फ़ाइल पहली बार ऐप चल रही है या नहीं, लेकिन मैं जानना चाहता था कि ऐसा करने का एक बेहतर तरीका है या नहीं।यह जांचने का सबसे अच्छा तरीका है कि कोई आईफोन ऐप पहली बार चल रहा है

उत्तर

69

मुझे पहले रन के संकेत को स्टोर करने के लिए 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

जहां परीक्षण करना है ?? ऐप में लॉन्च विधि खत्म हो गया ?? – prajakta

+0

क्या आप इसे 'applicationDidFinishLaunchingWithOptions' में डाल देंगे? –

+0

क्या यह अभी भी काम करेगा यदि यह क्लाउड पर बैक किया गया हो? –

5

अपने अनुप्रयोग प्रतिनिधि में एक डिफ़ॉल्ट मान रजिस्टर:

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]; 
} 
+1

क्या आपको अपना फर्स्ट लॉन्च नहीं करना चाहिए, तो अगर यह अगले ऐप पुनरावृत्ति पर नहीं चलता है? –

+0

@ brian.clear, केवल अगर आपको यह पुष्टि करने की आवश्यकता नहीं है कि उपयोगकर्ता ने उस सामग्री को देखा जिसे आप दिखाना चाहते थे, तो करने/पुष्टि करने के लिए प्रारंभिकता नहीं है। उदाहरण के लिए, मेरे मामले में पहले भाग पर, मैं चाहता हूं प्रयोक्ता यह पुष्टि करने के लिए कि उन्होंने ट्यूटोरियल देखा है या इसे खोलने के बजाय इसे छोड़ना चुना है, फिर अपने फोन को लॉक कर दिया है और अंत में मेरा ऐप मेमोरी से बाहर हो रहा है। असामान्य लग सकता है, लेकिन मैंने कहीं भी लाइन में प्रतीक्षा करते समय एक नया ऐप डाउनलोड करते समय कई बार ऐसा किया है, ऐप को पहली बार लॉन्च कर रहा है, फिर मेरे फोन को तुरंत लॉक कर रहा है b/c यह मेरी बारी रेखा में था। तो, उपयोग के मामले पर निर्भर करता है। सही बात? – thephatp

1

NSUserDefaults का उपयोग करें। यदि साझा किए गए डीफॉल्ट के पास आपके ऐप की कुंजी है, तो इससे पहले चलाएं। बेशक, ऐप को पहली बार ऐप चलाने पर ऐप को कम-से-कम एक डिफ़ॉल्ट प्रविष्टि बनाना होगा।

8

ठीक है उपयोगकर्ता डिफ़ॉल्ट के बारे में मुझे क्या भ्रमित करता है।

वे कहां संग्रहीत हैं?

  • आपको परवाह नहीं है कि यह आईओएस/मैक प्रति भिन्न होता है।
  • तुम सिर्फ प्रमुख द्वारा कुंजी
  • setValue द्वारा getValue + सिंक्रनाइज़
  • आईओएस/मैक बाकी है।

यह सामान्य उपयोग केस है: किसी मान के अस्तित्व की जांच करना पहले उदाहरण। पहली बार यह EXIST नहीं होगा, इसलिए आमतौर पर मान सेट करके पीछा किया जाता है। 2 सरा रन - अगले पाश पर यह मौजूद है और अन्य उपयोग के मामले/बाकी stmt शुरू हो रहा है

---- ज

@interface MyAppDelegate : UIResponder <UIApplicationDelegate> 

//flag to denote if this is first time the app is run 
@property(nonatomic) BOOL firstRun; 

------ मीटर

@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; 
    //============= 

// नोट महत्वपूर्ण यदि आप 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"); 
} 

ऊपर दिए गए उदाहरणों मुझे थोड़ी उलझन में ध्वज का उपयोग करने से पहले ऊपर जाँच के रूप में वे पहली बार के लिए जाँच करने के लिए कैसे पता चलता है लेकिन फिर एक ही टिप्पणी में 'बाद में इसकी जांच करें' का उल्लेख करें। समस्या तब होती है जब हमें लगता है कि यह अस्तित्व में नहीं है हम तुरंत इसे बनाते हैं और सिंक्रनाइज़ करते हैं। तो देर से वास्तव में इसका मतलब यह है कि जब आप एपीपी को पहले रन के समान नहीं चलाते हैं।

+0

आईफोन सिम्युलेटर से भंडारण (इन "डिफ़ॉल्ट") को साफ़ करने का सही तरीका क्या है? –

+0

मेरे लिए एकमात्र समाधान काम किया धन्यवाद! –

+0

डिफ़ॉल्ट रूप से boolForKey झूठी वापसी करेगा, तार शून्य होगा आदि यदि आप उपयोगकर्ता डिफ़ॉल्ट को प्रारंभ करना चाहते हैं तो केवल उन कुंजी और मानों के साथ रजिस्टर डिफॉल्ट का उपयोग करें, जिन्हें आप उपयोग करना चाहते हैं। यदि आप किसी तारीख को प्रारंभ करना चाहते हैं, तो [NSDate दूरस्थ भविष्य] का उपयोग कर सकते हैं – shim

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; 
} 
2

आप UIViewController + FirstLaunch के साथ एक कस्टम श्रेणी विधि isFirstLaunch उपयोग कर सकते हैं।

- (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 
} 
0

स्विफ्ट की जरूरत है:

var isFirstLaunch: Bool { 
    get { 
     if (NSUserDefaults.standardUserDefaults().objectForKey("firstLaunchDate") == nil) { 
      NSUserDefaults.standardUserDefaults().setObject(NSDate(), forKey: "firstLaunchDate") 
      NSUserDefaults.standardUserDefaults().synchronize() 
      return true 
     } 
     return false 
    } 
} 

एक और टिप:

NSUserDefaults का उपयोग करते समय इन सेटिंग्स अगर मिटा दिया जाएगा ऐप कभी हटा दिया जाता है। अगर किसी कारण से आपको इन सेटिंग्स को अभी भी आसपास लटकने की आवश्यकता है, तो आप उन्हें कीचेन में स्टोर कर सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे