स्विफ्ट में एक अद्वितीय डिवाइस आईडी कैसे प्राप्त करें?


181

मैं स्विफ्ट में एक अद्वितीय आईडी कैसे प्राप्त कर सकता हूं?

मुझे डेटाबेस में उपयोग करने के लिए एक आईडी की आवश्यकता है और मेरे सामाजिक ऐप में मेरी वेब सेवा के लिए एपीआई-कुंजी के रूप में। इस उपकरण का दैनिक उपयोग करने के लिए कुछ का उपयोग करें और इसके प्रश्नों को डेटाबेस तक सीमित करें।

धन्यवाद!

जवाबों:


386

आप इसका उपयोग कर सकते हैं (स्विफ्ट 3):

UIDevice.current.identifierForVendor!.uuidString

पुराने संस्करणों के लिए:

UIDevice.currentDevice().identifierForVendor

या यदि आप एक स्ट्रिंग चाहते हैं:

UIDevice.currentDevice().identifierForVendor!.UUIDString


उपयोगकर्ता द्वारा एप्लिकेशन को अनइंस्टॉल करने के बाद डिवाइस को विशिष्ट रूप से पहचानने का कोई तरीका नहीं है। प्रलेखन कहता है:

इस संपत्ति में मूल्य समान रहता है जबकि आईओएस डिवाइस पर ऐप (या उसी विक्रेता से कोई अन्य ऐप) स्थापित होता है। जब उपयोगकर्ता डिवाइस से उस विक्रेता के सभी एप्लिकेशन हटाता है और बाद में उनमें से एक या अधिक को पुनर्स्थापित करता है, तो मान बदल जाता है।


आप अधिक जानकारी के लिए मैट थॉम्पसन के इस लेख को भी पढ़ना चाह सकते हैं:
http://nshipster.com/uuid-udid-unique-identifier/

स्विफ्ट 4.1 के लिए अपडेट , आपको उपयोग करना होगा:

UIDevice.current.identifierForVendor?.uuidString

शायद जोड़ें ।UIDString ताकि यह वास्तव में एक सर्वर को भेजा जा सके?
डेनियल गैलास्को

2
हाँ। मुझे लगा कि यह स्पष्ट बात है, लेकिन मैंने इसे उत्तर में शामिल किया।
एटोमिक्स

19
एप्लिकेशन अनइंस्टॉल करने के बाद यह संख्या अब समान नहीं है। ऐप अनइंस्टॉल होने के बाद भी डिवाइस को ट्रैक करने का कोई तरीका है?
jmcastel

5
बेहतर सवाल है, अगर इसकी स्थापना रद्द करने के बाद हटा दी जाती है, तो जब आप आईडी का उपयोग नहीं करते हैं तो आप अपने सर्वर पर उनका खाता कैसे हटाते हैं?
जेसन जी

2
@UmairAfzal बहुत सारी चीजें सिम्युलेटर में काम नहीं करती हैं। क्या आपने इसे असली डिवाइस पर आज़माया है?
एटमिक्स

10

आप UIDevice क्लास में मौजूद आइडेंटिफायरफॉरेंडर पब्लिक प्रॉपर्टी का इस्तेमाल कर सकते हैं

let UUIDValue = UIDevice.currentDevice().identifierForVendor!.UUIDString
        print("UUID: \(UUIDValue)")

संपादित स्विफ्ट 3:

UIDevice.current.identifierForVendor!.uuidString

END EDIT

संपत्ति पदानुक्रम के लिए स्क्रीनशॉट


3
यह सिर्फ @Atomix उत्तर की एक प्रति है
एशले मिल्स

10

के लिए स्विफ्ट 3.X नवीनतम कार्य संहिता, आसानी से उपयोग;

   let deviceID = UIDevice.current.identifierForVendor!.uuidString
   print(deviceID)

3
यह बदल जाता है जब भी स्थापना रद्द करें और एप्लिकेशन को फिर से इंस्टॉल करें।
iPeter

7
यह सिर्फ @Atomix & JayprakasDubey के जवाबों की एक प्रति है
एशले मिल्स

10

आप devicecheck का उपयोग कर सकते हैं (स्विफ्ट 4 में) Apple प्रलेखन

func sendEphemeralToken() {
        //check if DCDevice is available (iOS 11)

        //get the **ephemeral** token
        DCDevice.current.generateToken {
        (data, error) in
        guard let data = data else {
            return
        }

        //send **ephemeral** token to server to 
        let token = data.base64EncodedString()
        //Alamofire.request("https://myServer/deviceToken" ...
    }
}

विशिष्ट उपयोग:

आमतौर पर, आप यह सुनिश्चित करने के लिए DeviceCheck API का उपयोग करते हैं कि एक नए उपयोगकर्ता ने पहले से ही एक ही डिवाइस पर भिन्न उपयोगकर्ता नाम के तहत ऑफ़र भुनाया नहीं है।

सर्वर कार्रवाई की जरूरत है:

WWDC 2017 - सत्र 702 देखें

संतोष बोत्र लेख से अधिक - iOS उपकरणों के लिए विशिष्ट पहचानकर्ता

आपका संबद्ध सर्वर इस टोकन को एक प्रमाणीकरण कुंजी के साथ जोड़ता है जिसे आप Apple से प्राप्त करते हैं और परिणाम का उपयोग प्रति-डिवाइस बिट्स तक पहुंचने का अनुरोध करते हैं।


1
यदि मैं इसे सही ढंग से समझ रहा हूं, तो टोकन पीढ़ी DCDevice.generateToken () का उपयोग करके किया जाता है, और प्रत्येक कॉल एक अद्वितीय, यादृच्छिक device_token उत्पन्न करता है। इसलिए, device_token लगातार नहीं है, लेकिन अल्पकालिक है। मुझे समझ में नहीं आता है कि सर्वर एक उपकरण के साथ एक पंचभूत टोकन को कैसे जोड़ सकता है।
user1118764

@ user1118764 "दो बिट्स सेट करें - इस टोकन को साझा करने के लिए एप्लिकेशन सर्वर जिम्मेदार होगा और बिट मान सेट करेगा।" अधिक यहाँ पढ़ medium.com/@santoshbotre01/... आधिकारिक दस्तावेज से है और यह भी यहाँ developer.apple.com/documentation/devicecheck/... और 702 सत्र developer.apple.com/videos/play/wwdc2017/702
iluvatar_GR

1

स्विफ्ट 2.2

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.objectForKey("ApplicationIdentifier") == nil {
        let UUID = NSUUID().UUIDString
        userDefaults.setObject(UUID, forKey: "ApplicationIdentifier")
        userDefaults.synchronize()
    }
    return true
}

//Retrieve
print(NSUserDefaults.standardUserDefaults().valueForKey("ApplicationIdentifier")!)

2
यदि उपयोगकर्ता एप्लिकेशन को हटा देता है तो यह बेकार है क्योंकि उपयोगकर्ता की स्थापना रद्द करने के साथ उपयोगकर्ता भी हटाए जाते हैं।
रेहान अली

0
if (UIDevice.current.identifierForVendor?.uuidString) != nil
        {
            self.lblDeviceIdValue.text = UIDevice.current.identifierForVendor?.uuidString
        }

1
कृपया अपने कोड और / या विवरण की पेशकश करें और यह कैसे पोस्ट किए गए प्रश्न को हल करता है, इसकी व्याख्या करें।
रयाननर्ड

-1
class func uuid(completionHandler: @escaping (String) -> ()) {
    if let uuid = UIDevice.current.identifierForVendor?.uuidString {
        completionHandler(uuid)
    }
    else {
        // If the value is nil, wait and get the value again later. This happens, for example, after the device has been restarted but before the user has unlocked the device.
        // https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor?language=objc
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            uuid(completionHandler: completionHandler)
        }
    }
}

-1

उपयोगकर्ता द्वारा डिवाइस से उस विक्रेता के सभी एप्लिकेशन को हटाए जाने पर पहचानकर्ता फ़ोरवेंडर का मूल्य बदल जाता है, यदि आप बाद की ताज़ा स्थापनाओं के लिए भी यूनिक आईडी रखना चाहते हैं, तो आप निम्न फ़ंक्शन का उपयोग करने का प्रयास कर सकते हैं

func vendorIdentifierForDevice()->String {
    //Get common part of Applicatoin Bundle ID, Note : getCommonPartOfApplicationBundleID is to be defined.
    let commonAppBundleID = getCommonPartOfApplicationBundleID()
    //Read from KeyChain using bunndle ID, Note : readFromKeyChain is to be defined.
    if let vendorID = readFromKeyChain(commonAppBundleID) {
        return vendorID
    } else {
        var vendorID = NSUUID().uuidString
        //Save to KeyChain using bunndle ID, Note : saveToKeyChain is to be defined.
        saveToKeyChain(commonAppBundleID, vendorID)
        return vendorID
    }
}

किसने कभी इस जवाब को वोट दिया, क्या आप बता सकते हैं कि इस वोट ने नीचे क्यों डाला? getCommonPartOfApplicationBundleID (), readFromKeyChain, saveToKeyChain कस्टम तरीके हैं जिन्हें आपको लागू करने की आवश्यकता है, मैंने उन परिभाषाओं को शामिल नहीं किया है जो उत्तर के आकार को बढ़ाने के लिए नहीं सोच रही हैं।
शिहाब

जब ऐप अनइंस्टॉल किया जाता है तो क्या किचेन में स्टोर किए गए मान बने रहते हैं?
अनीस

1
@Anees, आप सही हैं I मेरा उत्तर iOS 10.3 बीटा 2 से मान्य नहीं है, यह एप्लिकेशन अनइंस्टॉल होने के बाद चाबी के आइटम को हटा देता है, अगर कोई साझा ऐप नहीं है। तो अंत में यह वही होगा जो पहचानकर्ता के रूप में व्यवहार करेगा।
शिहाब

-18

मैंने कोशिश की है

let UUID = UIDevice.currentDevice().identifierForVendor?.UUIDString

बजाय

let UUID = NSUUID().UUIDString

और यह काम करता है।


30
NSUUID ()। UUIDString आपको हर बार एक नया तार देगा
एरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.