जब कोई ऐप अनइंस्टॉल हो जाए तो किचेन आइटम हटाएं


238

मैं कीचेन के लिए आइडेंडर्सन के स्किफिफी-आईफोन कोड का उपयोग कर रहा हूं और पासवर्ड का उपयोग कर बचत कर रहा हूं

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

जब मैं डिवाइस से एप्लिकेशन को हटाता हूं, तो पासवर्ड किचेन में रहता है।

जब उपयोगकर्ता डिवाइस से एप्लिकेशन हटाता है तो मैं किचेन से पासवर्ड निकालना चाहता हूं। मैं यह कैसे कर सकता हूँ?


13
चूंकि आपका एप्लिकेशन डिलीट होने पर आपका कोड नहीं चलता है, इसलिए आपके पास ऐसा करने का कोई तरीका नहीं है।
जोनाथन ग्रियर्सन

1
मुझे लगता है कि आप केवल ऐप के अंदर से एक किचेन आइटम को हटा सकते हैं, लेकिन इसे अनइंस्टॉल करने से पहले नहीं। आप SFHFKeychainUtils के deleteItem मेथड पर एक नजर डाल सकते हैं।
मैटोडव

जवाबों:


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यदि यह पहले से सेट नहीं है, तो यह आपके ऐप के पहले रन में "FirstRun" कुंजी / मान सेट करता है। वहाँ एक टिप्पणी है जहाँ आपको चाबी का गुच्छा से मूल्यों को हटाने के लिए कोड डालना चाहिए। सिंक्रनाइज़ेशन को यह सुनिश्चित करने के लिए कहा जा सकता है कि "FirstRun" कुंजी / मान तुरंत बना रहता है यदि उपयोगकर्ता सिस्टम को बनाए रखने से पहले ऐप को मैन्युअल रूप से मारता है।


2
मैं एमरो से सहमत हूं कि आप एप्लिकेशन के पहले भाग पर अपने किचेन को हटा सकते हैं / शुद्ध कर सकते हैं। यह सब कुछ साफ कर देगा जो पिछली बार ऐप को अनइंस्टॉल करने से पहले सेट किया गया था। मैंने अपने एक ऐप के लिए ऐसा किया है जो फेसबुक / ट्विटर क्रेडेंशियल्स को स्टोर करता है और यह इस तथ्य को अच्छी तरह से काम कर रहा है कि केवल आपके ऐप के पास जो भी चाबी का गुच्छा सेट किया गया था उसकी पहुंच है।
XCool

इस संकेत के लिए धन्यवाद।
iOSAppDev

3
NSUserDefaults उपयोगकर्ता द्वारा ऐप को मैन्युअल रूप से छोड़ने पर साफ़ नहीं किया जाता है। केवल वे मान जो आपने सेट किए हैं, लेकिन या तो सिस्टम (समय-समय पर) या आप अभी तक डिस्क के साथ सिंक्रनाइज़ नहीं किए गए हैं (कॉल करके synchronize) उस मामले में खो गए हैं। पहला रन कुंजी सेट करने के बाद सिंक्रोनाइज़ करना एक अच्छा विचार है। और हाँ, NSUserDefaults को तब साफ़ किया जाता है जब कोई उपकरण रीसेट किया जाता है (और बैकअप से पुनर्स्थापित नहीं किया जाता है), और वह इस मामले में ठीक है।
अमरो

5
आप गलत हैं और आप शायद कुछ ऐसा कर रहे हैं जिससे उपयोगकर्ता चूक साफ हो जाए। NSUserDefaults का पूरा बिंदु वरीयताओं को सहेजना है और उन प्राथमिकताओं को कई एप्लिकेशन लॉन्च के माध्यम से जारी रखना है। फिर से, डिवाइस को रीसेट करने या ऐप को हटाने से उपयोगकर्ता की चूक दूर हो जाएगी। देखो कि कितने लोगों ने इस उत्तर को वोट दिया है और अपने कोड की जांच करें। फिर प्रलेखन पढ़ें। बिल्ली, मुझे संबंधित कोड भेजें और मैं आपको दिखाऊंगा कि आप क्या गलत कर रहे हैं। यह iOS 2.0 के बाद से इस तरह से है। नीचे मत देना, लेकिन मैं पहले एक अलग, सरल, परीक्षण मामले को लिखने का सुझाव दूंगा।
अमरो

9
मैं इसके लिए NSUserDefault का उपयोग करने पर बहुत आश्वस्त नहीं होगा। क्यों? उस धागे पर एक नज़र डालें: stackoverflow.com/questions/20269116/… । यदि आप पृष्ठभूमि से अपना ऐप शुरू करते हैं, तो ऐसे मामले हैं जहां NSUserDefaults में आपकी कस्टम कुंजी बस सेट नहीं है। इस उत्तर को लागू करने से आपके किचेन कस्टम कुंजी को हटाना पड़ेगा, हालांकि आप वास्तव में ऐसा नहीं चाहते हैं!
औरेलिन पोर्ते

40

एक की तलाश में उपयोगकर्ताओं के लिए @ Amro के उत्तर के स्विफ्ट 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

जब डिवाइस से ऐप हटा दिया जाता है तो कोड निष्पादित करने के लिए कोई ट्रिगर नहीं होता है। किचेन तक पहुंच उस प्रोविजनिंग प्रोफाइल पर निर्भर करती है जिसका उपयोग एप्लिकेशन को साइन करने के लिए किया जाता है। इसलिए कोई अन्य एप्लिकेशन किचेन में इस जानकारी तक नहीं पहुंच पाएंगे।

जब आप उपयोगकर्ता डिवाइस से एप्लिकेशन हटाते हैं तो यह किचेन में पासवर्ड को हटाने के उद्देश्य से आपके साथ मदद नहीं करता है, लेकिन इससे आपको कुछ आराम मिलेगा कि पासवर्ड पहुंच योग्य नहीं है (केवल मूल एप्लिकेशन के पुन: इंस्टॉल होने से)।


इसलिए, यदि हम अपने एप्लिकेशन के प्रोविज़निंग प्रोफाइल को बदलते हैं, तो क्या यह किचेन में पहले से संचित मूल्यों तक पहुँच बना सकेगा।
मोआज सईद

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

C # Xamarin संस्करण

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

... और किचेन से रिकॉर्ड साफ करने के लिए (TODO टिप्पणी ऊपर)

        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

@ एम्रो के जवाब का अनुवाद स्विफ्ट 4.0:

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

या यहां तक if !UserDefaults.standard.bool(forKey: "FirstInstall")कि अगर कुंजी मौजूद नहीं है तो झूठे के लिए चूक। और .synchronize () की आवश्यकता नहीं है।
चार्ल्सए

3

ऐसा लगता है कि iOS 10.3 पर डिफ़ॉल्ट व्यवहार व्यवहार लोगों के बीटा # 2 में देखा गया है । इस बारे में अभी तक कोई आधिकारिक दस्तावेज नहीं मिला है इसलिए कृपया टिप्पणी करें यदि आपके पास है।


7
यह तब तक था जब तक कि बीटा 5 i का अनुमान नहीं है, iOS 10.3 की सार्वजनिक रिलीज में यह बदलाव नहीं है।
जैकब ट्रहला Jak
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.