কোনও অ্যাপ আনইনস্টল হয়ে গেলে কীচেন আইটেমগুলি মুছুন


238

আমি কীচেইনের জন্য আইড্যান্ডারসনের স্কিফিহিফাই-আইফোন কোড ব্যবহার করছি এবং ব্যবহার করে পাসওয়ার্ড সংরক্ষণ করব

[SFHFKeychainUtils storeUsername:@"User" andPassword:@"123"
              forServiceName:@"TestService" updateExisting:YES error:&error];

আমি যখন ডিভাইস থেকে অ্যাপ্লিকেশনটি মুছব তখন পাসওয়ার্ডটি কীচেইনে থাকবে।

ব্যবহারকারী যখন ডিভাইস থেকে অ্যাপ্লিকেশনটি মুছে ফেলেন তখন আমি কীচেন থেকে পাসওয়ার্ডটি সরাতে চাই। কিভাবে আমি এটি করতে পারব?


13
যেহেতু আপনার অ্যাপ্লিকেশনটি মোছার সময় আপনার কোডটি চলবে না, তাই আপনার এটি করার কোনও উপায় নেই।
জোনাথন গ্রিনস্পান

1
আমি মনে করি আপনি কেবল অ্যাপের অভ্যন্তর থেকে একটি কীচেইন আইটেম মুছতে পারেন, তবে এটি আনইনস্টল করার আগে নয়। আপনি কীচেইন থেকে একটি ব্যবহারকারীর নাম বা একটি পাসওয়ার্ড মুছতে SFHFKeychainUtils এর মুছুন আইটেম পদ্ধতিটি একবার দেখে নিতে পারেন।
ম্যাটদেডভ

উত্তর:


406

আপনি যে সুবিধা গ্রহণ করতে পারেন NSUserDefaults হয় একটি অ্যাপ্লিকেশন আনইনস্টল দ্বারা সাফ করা হয়েছে। উদাহরণ স্বরূপ:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Clear keychain on first run in case of reinstallation
    if (![[NSUserDefaults standardUserDefaults] objectForKey:@"FirstRun"]) {
        // Delete values from keychain here
        [[NSUserDefaults standardUserDefaults] setValue:@"1strun" forKey:@"FirstRun"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }

    //...Other stuff that usually happens in didFinishLaunching
}

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


2
আমি আম্রোর সাথে একমত হয়েছি যে আপনি অ্যাপ্লিকেশনটি প্রথম চালানোর পরে আপনার কেচেন মুছে ফেলতে / মুছতে পারবেন। এটি অ্যাপ্লিকেশনটিকে শেষবার আনইনস্টল করার আগে সেট করা সমস্ত কিছু পরিষ্কার করে দেবে। আমি আমার এমন একটি অ্যাপ্লিকেশানের জন্য এটি করেছি যা ফেসবুক / টুইটারের শংসাপত্রগুলি সংরক্ষণ করে এবং এটি খুব ভালভাবেই কাজ করে যাচ্ছিল তা জেনেও যে আপনার অ্যাপ্লিকেশনটিতে সেট করা কিছু কীচেইনে অ্যাক্সেস রয়েছে।
এক্সকুল

এই ইঙ্গিত জন্য ধন্যবাদ।
আইওএস অ্যাপদেভ

3
ব্যবহারকারী ম্যানুয়ালি অ্যাপটি ছাড়লে এনএসউসারডেফল্টগুলি সাফ হয় না। কেবলমাত্র মানগুলি আপনি সেট করেছেন তবে সিস্টেম (পর্যায়ক্রমে) অথবা আপনি এখনও ডিস্কের সাথে সিঙ্ক্রোনাইজ করেননি (কল করে synchronize) সেই ক্ষেত্রে হারিয়ে গেছে। প্রথম রান কী সেট করার পরে সিঙ্ক্রোনাইজ করা কল করা ভাল। এবং হ্যাঁ, কোনও ডিভাইস পুনরায় সেট করা হলে (এবং ব্যাকআপ থেকে পুনরুদ্ধার করা হয়নি) এনএসউসারডেফাল্টগুলি সাফ হয়ে যায়, এবং এটি ক্ষেত্রে ঠিক আছে।
আম্রো

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

9
আমি এর জন্য এনএসইউসারডেফল্ট ব্যবহার করার ক্ষেত্রে খুব বেশি আত্মবিশ্বাসী থাকব না। কেন? এই থ্রেডটি একবার দেখুন: stackoverflow.com/questions/20269116/… । আপনি যদি আপনার অ্যাপ্লিকেশনটিকে পটভূমি থেকে শুরু করেন তবে এমন কিছু ক্ষেত্রে রয়েছে যেখানে আপনার কাস্টম কীগুলি এনএসইউসারডেফাল্টসে সেট করা নেই। এই উত্তরটি প্রয়োগ করা আপনার কীচেইন কাস্টম কীগুলি মুছে ফেলতে পারে যদিও আপনি সত্যই এটি চাননি!
অরেলিন পোর্টে

40

ব্যবহারকারীদের জন্য @ অ্যাম্রো এর উত্তরের একটি সুইফ্ট 3.0 সংস্করণ সন্ধান করছেন:

let userDefaults = UserDefaults.standard

if !userDefaults.bool(forKey: "hasRunBefore") {
     // Remove Keychain items here

     // Update the flag indicator
     userDefaults.set(true, forKey: "hasRunBefore")
}

* নোট করুন যে সিঙ্ক্রোনাইজ () ফাংশনটি হ্রাস করা হয়েছে


2
if !userDefaults.bool(forKey: "hasRunBefore") {এটা ঠিক পরিষ্কার।
নেফেরিয়ান ব্ল্যাক

1
সিঙ্ক্রোনাইজ কলটি সরানো উচিত।
পোচি

30

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

ব্যবহারকারী যখন ডিভাইস থেকে অ্যাপ্লিকেশন মুছে ফেলেন তখন কীচেইনে পাসওয়ার্ড সরিয়ে ফেলার লক্ষ্য নিয়ে এটি আপনাকে সহায়তা করে না তবে এটি আপনাকে কিছুটা স্বাচ্ছন্দ্য দেয় যে পাসওয়ার্ডটি অ্যাক্সেসযোগ্য নয় (কেবলমাত্র মূল অ্যাপ্লিকেশনটির পুনরায় ইনস্টল থেকে)।


সুতরাং, আমরা যদি আমাদের অ্যাপ্লিকেশনটির প্রভিশন প্রোফাইল পরিবর্তন করি তবে কী কীচেইনে পূর্বে সঞ্চিত মানগুলি অ্যাক্সেস করতে সক্ষম হব?
মোয়াজ সা Saeed

27

যারা @ আম্রোর উত্তরের একটি স্যুইফ্ট সংস্করণ খুঁজছেন তাদের জন্য:

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.boolForKey("hasRunBefore") == false {

        // remove keychain items here


        // update the flag indicator
        userDefaults.setBool(true, forKey: "hasRunBefore")
        userDefaults.synchronize() // forces the app to update the NSUserDefaults

        return
    }

9

সি # জামারিন সংস্করণ

    const string FIRST_RUN = "hasRunBefore";
    var userDefaults = NSUserDefaults.StandardUserDefaults;
    if (!userDefaults.BoolForKey(FIRST_RUN))
    {
        //TODO: remove keychain items
        userDefaults.SetBool(true, FIRST_RUN);
        userDefaults.Synchronize();
    }

... এবং কীচেন থেকে রেকর্ডগুলি সাফ করার জন্য (উপরে মন্তব্য করার জন্য)

        var securityRecords = new[] { SecKind.GenericPassword,
                                    SecKind.Certificate,
                                    SecKind.Identity,
                                    SecKind.InternetPassword,
                                    SecKind.Key
                                };
        foreach (var recordKind in securityRecords)
        {
            SecRecord query = new SecRecord(recordKind);
            SecKeyChain.Remove(query);
        }

1
if (VersionTracking.IsFirstLaunchEver) {// remove keychain items}Xamarin.Essentials থেকে ব্যবহার করে আপনার জন্য কোডের দরকার নেই userDefaultsXamarin.Essentials আপনার জন্য এটি আবৃত করে
ক্রিস্টোফার স্টিফান

7

ব্যবহারকারীরা অ্যাপটি আনইনস্টল করলে আপনার অ্যাপ্লিকেশনটির নথি ডিরেক্টরি থেকে ফাইলগুলি মুছে ফেলা হবে। এটি জানার পরে, আপনাকে যা করতে হবে তা হ'ল প্রথমে যে ফাইলটি ঘটে যায় সে হিসাবে কোনও ফাইল উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখুনapplication:didFinishLaunchingWithOptions: । এর পরে, নিঃশর্তভাবে ফাইলটি তৈরি করুন (এমনকি এটি কেবল একটি ডামি ফাইল হলেও)।

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


7

@ আম্রোর উত্তরটি সুইফট ৪.০ এ অনুবাদ করা হয়েছে:

if UserDefaults.standard.object(forKey: "FirstInstall") == nil {
    UserDefaults.standard.set(false, forKey: "FirstInstall")
    UserDefaults.standard.synchronize()
}

বা এমনকি if !UserDefaults.standard.bool(forKey: "FirstInstall")যদি চাটির অস্তিত্ব না থাকে তবে কোনটি ডিফল্ট হয় false এবং .সাইনক্রোনাইজ () দরকার নেই।
চার্লস

3

এটি বিটা # 2 তে লোকেরা সাক্ষরিত আচরণের ভিত্তিতে আইওএস 10.3 এ ডিফল্ট আচরণ বলে মনে হচ্ছে । এখনও এটি সম্পর্কে কোনও অফিসিয়াল ডকুমেন্টেশন খুঁজে পাওয়া যায় নি তাই আপনার যদি থাকে তবে মন্তব্য করুন।


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