কোনও আইফোনে প্রথমবারের অ্যাপ্লিকেশন লঞ্চটি কীভাবে সনাক্ত করা যায়


163

আমি কীভাবে প্রথমবারের প্রথম প্রবর্তন সনাক্ত করতে পারি

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  // if very first launch than perform actionA
  // else perform actionB
}

পদ্ধতি?


উত্তর:


386
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
    {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    return YES;
}

আমি একটি ত্রুটি পেয়েছি কারণ পদ্ধতিটি কোনও বুলিয়ান মান দেয় না। আমি যদি রিটার্ন 0 ব্যবহার করি; ত্রুটি মারতে এটি ব্যর্থ হয়।
mrEmpty

@ এমআরএম্পটি ১. ??? এটি ফিরে আসে BOOL। ২. তবে ত্রুটিটি আপনার কোডে রয়েছে ... যদি 0 প্রত্যাবর্তন করা এই ক্র্যাশ করে তবে কিছু ভয়ঙ্করভাবে ভুল is অন্য কোথাও।

@ H2CO3 - NSUserDefaultsএকটি সাধারণ জায়গা নয়? যদি অন্য অ্যাপ্লিকেশন একই "কী" ব্যবহার করে যা আমি ব্যবহার করি?
জিভ লেভি

6
@ জাইভলভি না, ব্যবহারকারীর ডিফল্টগুলি প্রতি স্যান্ডবক্স (= প্রতি-প্রয়োগ) ভিত্তিতে সম্পত্তি তালিকায় সংরক্ষণ করা হয়।

2
এটি কেবলমাত্র এমন নতুন অ্যাপ্লিকেশনগুলির জন্য কাজ করবে যা আগে কখনও জমা দেয় নি।
এলাদ

36

ইন সুইফট 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
        }
    }

ইন সুইফট 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-সি আমি এই ব্যবহার,

+ (BOOL)isAppAlreadyLaunchedOnce {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isAppAlreadyLaunchedOnce"])
    {
        return true;
    }
    else
    {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isAppAlreadyLaunchedOnce"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        return false;
    }
}

ওবিজে-সি এর জন্য রেফ করুন: https://stackoverflow.com/a/9964400/3411787


32

এই উদ্দেশ্যেই আমি একটি ছোট গ্রন্থাগার লিখেছিলাম। এটি আমাকে জানাতে দেয় যে এটি এখন পর্যন্ত প্রথম লঞ্চ কিনা, বা কেবল এই সংস্করণের জন্য এবং ব্যবহারকারী ইনস্টল করে থাকা কোনও পূর্ববর্তী সংস্করণ। এটি অ্যাপাচি 2 লাইসেন্সের অধীনে কোকোপোড হিসাবে গিথুবে উপলব্ধ: জিবি ভার্সন ট্র্যাকিং

আপনি শুধু এটি কল application:didFinishLaunching:withOptions:

[GBVersionTracking track];

এবং তারপরে এটি প্রথম প্রবর্তন কিনা তা পরীক্ষা করতে কেবল এটিকে যে কোনও জায়গায় কল করুন:

[GBVersionTracking isFirstLaunchEver];

এবং একইভাবে:

[GBVersionTracking isFirstLaunchForVersion];

[GBVersionTracking currentVersion];
[GBVersionTracking previousVersion];
[GBVersionTracking versionHistory];

1
এটি প্রায় নিখুঁত! জিবিটুলবক্স নির্ভরতা এবং একটি পডস্পেক ছাড়া দুর্দান্ত হত।
স্টায়ান হিল্যান্ড

4
@ স্টিয়ানহিল্যান্ড জিবি টুলবক্স নির্ভরতা চলে গেছে, এবং গ্রন্থাগারটি একটি পডস্পেক নিয়ে আসে (কোকোপডস স্পেকস রেপোতে প্রকাশিত)।
lms

9

সুইফট 3.0 - সুইফট 5 এর জন্য

এক্সটেনশন যোগ করুন

    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()

8

এক্সকোড 7 এবং সুইফট 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
}

আমি ব্যক্তিগতভাবে এটির মতো ইউআইএ অ্যাপ্লিকেশনটির প্রসারকে পছন্দ করি:

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
}

8

আপনি এটি নীচে স্থিতিক পদ্ধতিতে প্রয়োগ করতে পারেন:

+ (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;
}

মনে রাখবেন যে আপনি যদি থ্রেডটি নিরাপদ রাখতে চান তবে আপনাকে এই পদ্ধতিটি লক করতে হবে।
মাটি বট

9
আমি জানি, কিন্তু এই পদ্ধতিটি নয়। 2 থ্রেডগুলি যদি (! পতাকা) পৌঁছতে পারে flag যখন পতাকা নেই। তারা যদি ব্লকের ভিতরে যায় get এর মধ্যে একটি অভ্যন্তরে পৌঁছে NSUserDephaults সেট করবে এবং দ্বিতীয়টি "hasLaunchOnce" পাস করবে (কারণ প্রথম থ্রেড এটি ঘোষণা করেছে) এবং ফলাফলটি NO তে সেট করবে। তার মানে আপনি ভুল মান পেতে পারেন।
মাটি বট

5

লঞ্চ করার সময় আপনাকে কিছু সংরক্ষণ করতে হবে এবং তারপরে এটি বিদ্যমান কিনা তা পরীক্ষা করে দেখুন। যদি না হয়, এটি প্রথমবার। "কিছু" একটি ফাইল, একটি ডাটাবেস এন্ট্রি, ব্যবহারকারীর ডিফল্টে একটি সেটিং হতে পারে ....


4

এটি করা বেশ সহজ এবং এতে মাত্র ছয় লাইন কোডের প্রয়োজন।

আপনার অ্যাপ্লিকেশন লঞ্চ পছন্দগুলিতে বা অন্য যে কোনও জায়গায় এই কোডটি যুক্ত করা আপনার পক্ষে প্রথমবারের মতো আপনার অ্যাপ্লিকেশনটি চালিত হয়েছে কিনা তা পরীক্ষা করার প্রয়োজন হতে পারে useful

//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 পছন্দগুলিতে বুল ব্যবহার করবেন না কেবল পূর্ণসংখ্যায় আটকে থাকুন। অপরিজ্ঞাপিত হলে এগুলি শূন্যে ডিফল্ট হয়।

এছাড়াও, [theDefaults synchronize];লাইনটির প্রয়োজন নেই তবে আমি খুঁজে পেয়েছি যে যখন কোনও অ্যাপ্লিকেশন কয়েকশো ডিভাইস জুড়ে কয়েকবার চালিত হয়, ফলাফল সর্বদা নির্ভরযোগ্য হয় না, পাশাপাশি, এটি আরও ভাল অনুশীলন।


আপনার উদাহরণটি কার্যকর হয়, তবে সমস্ত ওপি এটি প্রথম শুরু কিনা তা জানতে চায়। একটি বুল এই জন্য পুরোপুরি সূক্ষ্ম। ব্যবহারকারী কতবার অ্যাপটি খোলেন তা যদি কেউ জানতে চায় তবে আপনার কোডটি বোধগম্য হয়।
টিলো

3

এনএসউসারডেফাল্টগুলিতে প্রথমবার একটি বোতল কী সংরক্ষণ করুন এটি হবেন না আপনি এটিকে হ্যাঁতে পরিবর্তন করবেন এবং অ্যাপটিকে মুছে না ফেলা বা পুনরায় ইনস্টল না করা পর্যন্ত এটি আবার প্রথমবারের মতো হবে।


3

দ্রুত এবং সহজ ফাংশন

- (BOOL) isFirstTimeOpening {
    NSUserDefaults *theDefaults = [NSUserDefaults standardUserDefaults];
    if([theDefaults integerForKey:@"hasRun"] == 0) {
        [theDefaults setInteger:1 forKey:@"hasRun"];
        [theDefaults synchronize];
        return true;
    }
    return false;
}

3

এক্সকোড in-এ সুইফট ২.০ এর জন্য অ্যাপ্লিকেশন.সুইফ্ট ফাইলে:

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

}

2

দ্রুতগতি

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 

2

দ্রুত পদক্ষেপে আমি এমন একটি বিশ্বব্যাপী ধ্রুবক ব্যবহার করার পরামর্শ দেব যা অ্যাপস ডেলিগেটের উপরে যেমন কোনও সুযোগের বাইরে খুব সহজেই করা যায়। অ্যাপ্লিকেশনটি সমাপ্ত না হওয়া পর্যন্ত এটি সঠিক মানে সেট করা থাকবে। অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে চলে যায় তবে এটি একই মানটি ফিরে আসবে। অ্যাপ্লিকেশন পুরোপুরি পুনরায় চালু করা হলে মানটি পরিবর্তন হবে।

let isFirstLaunch: Bool = {
    if !UserDefaults.standard.bool(forKey: "hasBeenLaunchedBeforeFlag") {
        UserDefaults.standard.set(true, forKey: "hasBeenLaunchedBeforeFlag")
        UserDefaults.standard.synchronize()
        return true
    }
    return false
}()

তবে সত্যই সত্যটি ট্র্যাক করা ভাল যে অ্যাপটি অন্তত একবার ব্যাকগ্রাউন্ডে প্রেরণ করা হয়েছে। এই ক্ষেত্রে আমি ইউআইএপ্লিকেশনটিতে একটি এক্সটেনশন ব্যবহার করতে পছন্দ করি এবং অ্যাপ্লিকেশনডিন্টারব্যাকগ্রাউন্ড পদ্ধতিতে পতাকা সেট করে যেমন:

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

এবং তারপরে আপনার অ্যাপের প্রতিনিধি বা দৃশ্যের প্রতিনিধি

func sceneDidEnterBackground(_ scene: UIScene) {
        UIApplication.didEnterBackground()
    }

2

সুইফ্ট 5 আইওএস 13।

আমি ক্রিস ফ্রেমজেন দ্বারা দ্রুত এবং সহজ পছন্দ করি । তাই আমি এটি আপডেট করেছি।

func isFirstTimeOpening() -> Bool {
  let defaults = UserDefaults.standard

  if(defaults.integer(forKey: "hasRun") == 0) {
      defaults.set(1, forKey: "hasRun")
      return true
  }
  return false

}

2

এক্সকোড 11 , সুইফট 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
}

তাহলে আপনি এটি হিসাবে কল

UIApplication.isFirstLaunch()

0

NSUserDephaults + ম্যাক্রো

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
}

0

দ্রুত উত্তর 5.0 এ কাজ করার একটি উত্তর এখানে রয়েছে। @ জায়েদ পাঠানের উত্তরের তুলনায় উন্নতি হ'ল কোনও গোপন চুক্তি নেই। কল করার আগে যদি আপনি setFirstAppLaunch()ঠিক একবার কল না করেন তবে আপনি isFirstAppLaunch()একটি দৃser়তা ত্রুটি পাবেন (কেবলমাত্র ডিবাগ মোডে)।

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()যখনই আপনি আপনার অ্যাপটি কল করা হয়েছে কিনা তা পরীক্ষা করতে চান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.