ios - डिवाइस पर आईओएस ऐप को अनइंस्टॉल करने के बाद आईओएस में पहचानकर्ता फॉरवेंडर को कैसे सुरक्षित रखें?




uuid uniqueidentifier (6)

मैं एक आईओएस ऐप विकसित कर रहा हूं जो लॉगिन के लिए वेब-सेवा कहता है और उस समय मैं उन पहचानकर्ताओं के लिए विशिष्ट रूप से डिवाइस की पहचान करने के लिए विक्रेता पहचानकर्ता (पहचानकर्ता फॉरवेन्डर) के साथ वेब सर्वर पर लॉगिन प्रमाण-पत्र भेजता हूं। इसलिए उपयोगकर्ता के पास केवल एक डिवाइस और एक प्रमाण पत्र हो सकता है ।

मुझे पहचानकर्ता के साथ पहचानकर्ता मिला

NSString *uuid = [[UIDevice currentDevice] identifierForVendor].UUIDString

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

समस्या तब होती है जब उपयोगकर्ता ऐप को अनइंस्टॉल करता है और इसे पुनः इंस्टॉल करता है, मैंने पाया कि पहचानकर्ता फॉरवेंडर बदल गया है। तो उपयोगकर्ता आगे नहीं बढ़ सकता है।

मैंने एप्पल दस्तावेज UIDevice दस्तावेज़ीकरण पढ़ा

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

तो मेरे मामले में इससे कैसे निपटें?


@ Nerowolfe के answer ।

SSKeychain डिफ़ॉल्ट सिंक्रनाइज़ेशन मोड के रूप में kSecAttrSynchronizableAny का उपयोग करता है। आप शायद identifierForVendor फॉरवेंडर को कई उपकरणों में सिंक नहीं करना चाहते हैं, इसलिए यहां एक कोड है:

// save identifierForVendor in keychain without sync
NSError *error = nil;
SSKeychainQuery *query = [[SSKeychainQuery alloc] init];
query.service = @"your_service";
query.account = @"your_account";
query.password = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
query.synchronizationMode = SSKeychainQuerySynchronizationModeNo;
[query save:&error];

आप अपने विक्रेता IDentifier को सहेजने के लिए KeyChain का उपयोग करने का प्रयास कर सकते हैं, जो तब तक मौजूद रहेगा जब तक कि आपका डिवाइस रीसेट न हो जाए, भले ही आप अपना ऐप अनइंस्टॉल करें।


आम तौर पर, identifierForVendor उपयोग न करें। इसके बजाय, एक कस्टम NSUUID उत्पन्न करने के लिए NSUUID का उपयोग करें और NSUUID स्टोर करें (क्योंकि ऐप हटा दिया गया है और पुनर्स्थापित किया गया है तो कीचेन हटाया नहीं गया है)।


किसी डिवाइस पर किसी अद्वितीय संख्या को लिंक करने का कोई निश्चित तरीका नहीं है, ऐप्पल गोपनीयता दिशानिर्देशों के साथ इसकी अनुमति नहीं है।

आप कीचेन में अपनी अनोखी आईडी को सहेजने का प्रयास कर सकते हैं, लेकिन यदि उपयोगकर्ता अपना डिवाइस साफ़ करता है तो यह आईडी भी चली जाती है।

आम तौर पर किसी डिवाइस को किसी डिवाइस से लिंक करना गलत होता है, क्योंकि आप अब उपयोगकर्ताओं की पहचान नहीं कर रहे हैं लेकिन डिवाइस। तो आपको बस अपना एपीआई बदलना चाहिए ताकि उपयोगकर्ता फिर से लॉगिन कर सके और विक्रेता आईडी उपयोगकर्ता खाते से जुड़ी हो।

इसके अलावा क्या होता है जब उपयोगकर्ता के पास एक डिवाइस और आईफोन और आईपैड की तरह एक डिवाइस होता है, और आप दोनों पर ऐप का उपयोग करता है? चूंकि आप प्रमाणीकरण एक अद्वितीय आईडी आधारित है, यह नहीं किया जा सकता है।


मैंने इस समस्या के लिए KeychainAccess फोड KeychainAccess उपयोग किया था।

आपकी पॉड फ़ाइल में:

pod 'KeychainAccess', '~> 2.4' //If you are using Swift 2.3 
pod 'KeychainAccess' //Defaults to 3.0.1 which is in Swift 3

फ़ाइल में KeychainAccess मॉड्यूल आयात करें जहां आप keychain में UUID सेट करना चाहते हैं

import KeychainAccess

कुंजीचैन से यूयूआईडी सेट करने और प्राप्त करने के लिए नीचे दिए गए कोड का प्रयोग करें:

नोट: बंडल आईडी महत्वपूर्ण है और यूयूआईडी मूल्य है

var bundleID = NSBundle.mainBundle().bundleIdentifier
    var uuidValue = UIDevice.currentDevice().identifierForVendor!.UUIDString

 //MARK: - setVenderId and getVenderId
    func setVenderId() {

        let keychain = Keychain(service: bundleID!)

        do {
            try keychain.set(venderId as String, key: bundleID!)
            print("venderId set : key \(bundleID) and value: \(venderId)")
        }
        catch let error {
            print("Could not save data in Keychain : \(error)")
        }
    }

    func getVenderId() -> String {
        let keychain = Keychain(service: bundleID!)
        let token : String = try! keychain.get(bundleID!)!
        return token
    }

स्विफ्ट संस्करण

func UUID() -> String {

    let bundleName = NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String
    let accountName = "incoding"

    var applicationUUID = SAMKeychain.passwordForService(bundleName, account: accountName)

    if applicationUUID == nil {

        applicationUUID = UIDevice.currentDevice().identifierForVendor!.UUIDString

        // Save applicationUUID in keychain without synchronization
        let query = SAMKeychainQuery()
        query.service = bundleName
        query.account = accountName
        query.password = applicationUUID
        query.synchronizationMode = SAMKeychainQuerySynchronizationMode.No

        do {
            try query.save()
        } catch let error as NSError {
            print("SAMKeychainQuery Exception: \(error)")
        }
    }

    return applicationUUID
}




identifier