Swift'te benzersiz bir cihaz kimliği nasıl edinilir?


181

Swift'te bir cihazın benzersiz kimliğini nasıl edinebilirim?

Veritabanında kullanmak için bir kimliğe ve sosyal uygulamamda web hizmetim için API anahtarı olarak ihtiyacım var. Bu cihazların günlük kullanımını takip edecek ve sorgularını veritabanıyla sınırlandıracak bir şey.

Teşekkürler!

Yanıtlar:


386

Bunu kullanabilirsiniz (Swift 3):

UIDevice.current.identifierForVendor!.uuidString

Eski sürümler için:

UIDevice.currentDevice().identifierForVendor

veya bir dize istiyorsanız:

UIDevice.currentDevice().identifierForVendor!.UUIDString


Artık kullanıcı uygulamaları kaldırdıktan sonra bir cihazı benzersiz şekilde tanımlamanın bir yolu yoktur. Belgeler diyor ki:

Uygulama (veya aynı tedarikçiden başka bir uygulama) iOS aygıtına yüklendiğinde bu özellikteki değer aynı kalır. Kullanıcı, satıcının tüm uygulamalarını cihazdan sildikten sonra bir veya daha fazla uygulamayı yeniden yüklediğinde değer değişir.


Daha fazla bilgi için Mattt Thompson'ın bu makalesini de okumak isteyebilirsiniz:
http://nshipster.com/uuid-udid-unique-identifier/

Swift 4.1 Güncellemesi , şunları kullanmanız gerekecek:

UIDevice.current.identifierForVendor?.uuidString

belki de gerçekten bir sunucuya gönderilebilir .UUIDString ekleyin?
Daniel Galasko

2
Evet. Bunun açık bir şey olduğunu düşündüm, ama cevaba ekledim.
Atomix

19
Uygulamanın kaldırılmasından sonra bu sayı artık aynı değil. Uygulama kaldırıldıktan sonra bile bir cihazı izlemenin bir yolu var mı?
jmcastel

5
daha iyi bir soru, kaldırma işleminden sonra kaldırılırsa, kimlik artık kullanılmadığında sunucunuzdaki hesaplarını nasıl silebilirsiniz?
Jason G

2
@UmairAfzal Simülatörde pek çok şey çalışmıyor. Gerçek cihazda denedin mi?
Atomix

10

UIDevice sınıfında bulunan identifierForVendor genel özelliğini kullanabilirsiniz

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

Swift 3'ü DÜZENLE :

UIDevice.current.identifierForVendor!.uuidString

SON DÜZENLEME

Property hierarchy paketi için ekran görüntüsü


3
Bu, @Atomix yanıtının sadece bir kopyasıdır
Ashley Mills

10

İçin Swift 3.X Son Çalışma Kodu, kolayca kullanım;

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

3
Bu, uygulamayı kaldırmayı ve yeniden yüklemeyi kullandığınızda değişir.
iPeter

7
Bu @Atomix & JayprakasDubey'in cevaplarının sadece bir kopyası
Ashley Mills

10

Sen kullanabilirsiniz devicecheck (Swift 4) Elma dokümantasyon

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

Tipik kullanım:

Tipik olarak, yeni bir kullanıcının aynı cihazda farklı bir kullanıcı adı altında bir teklifi zaten kullanmadığından emin olmak için DeviceCheck API'lerini kullanırsınız.

Sunucu işleminin gereksinimleri:

WWDC 2017'ye bakınız - Oturum 702

Both makalesinden daha fazlası - iOS Cihazlar için Benzersiz Tanımlayıcı

İlişkili sunucunuz bu belirteci Apple'dan aldığınız bir kimlik doğrulama anahtarıyla birleştirir ve sonucu aygıt başına bitlere erişim istemek için kullanır.


1
Doğru anlıyorsam, token oluşturma DCDevice.generateToken () kullanılarak gerçekleştirilir ve her çağrı benzersiz, rastgele bir device_token oluşturur. Bu nedenle, device_token kalıcı değil, geçici. Anlamadığım şey, sunucunun geçici bir jetonu bir cihazla nasıl ilişkilendirebileceğidir.
user1118764

@ user1118764 "İki bit ayarla - Uygulama sunucusu bu belirteci paylaşmaktan ve bit değerini ayarlamaktan sorumlu olacaktır." buradan daha fazla bilgi medium.com/@santoshbotre01/… ve ayrıca burada resmi belgeler geliştirici geliştiriciden.apple.com/ documentation/ devicecheck/… ve 702 oturum geliştirici.apple.com/
iluvatar_GR

1

Hızlı 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
Kullanıcının uygulamayı silmesi işe yaramaz çünkü kullanıcı hataları uygulama kaldırıldığında da silinir.
Rehan Ali

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

1
Lütfen kodunuzu ve / veya teklif ayrıntılarınızı ve bunun gönderilen soruyu nasıl çözdüğünü açıklayın.
RyanNerd

-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

IdentifierForVendor'ın değeri , kullanıcı bu satıcının tüm uygulamalarını cihazdan sildiğinde değişir, sonraki taze yüklemeler için bile benzersiz kimliği korumak isterseniz, aşağıdaki işlevi kullanmayı deneyebilirsiniz

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

Kim bu cevaba oy verdi, lütfen bunun neden oy verdiğini açıklayabilir misiniz? getCommonPartOfApplicationBundleID (), readFromKeyChain, saveToKeyChain, uygulamanız gereken özel yöntemlerdir, cevabın boyutunu artırmak için değil bu tanımı düşünerek dahil etmedim.
Shihab

Uygulama kaldırıldığında anahtarlıkta saklanan değerler devam ediyor mu?
Anees

1
@Anees, cevabımın iOS 10.3 Beta 2'den geçerli olmadığını doğruladınız, paylaşılan uygulamalar yoksa uygulama kaldırıldıktan sonra anahtarlık öğelerini otomatik olarak siler. Son olarak, tanımlayıcı ForVendor methid ile aynı davranış olacaktır.
Shihab

-18

İle denedim

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

yerine

let UUID = NSUUID().UUIDString

ve çalışıyor.


30
NSUUID () .UUIDString size her seferinde yeni bir dize verecek
Eric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.