Bagaimana cara mendapatkan ID perangkat unik di Swift?


181

Bagaimana saya bisa mendapatkan ID unik perangkat di Swift?

Saya memerlukan ID untuk digunakan dalam database dan sebagai kunci API untuk layanan web saya di aplikasi sosial saya. Sesuatu untuk melacak penggunaan perangkat ini setiap hari dan membatasi permintaannya ke basis data.

Terima kasih!

Jawaban:


386

Anda dapat menggunakan ini (Swift 3):

UIDevice.current.identifierForVendor!.uuidString

Untuk versi yang lebih lama:

UIDevice.currentDevice().identifierForVendor

atau jika Anda ingin string:

UIDevice.currentDevice().identifierForVendor!.UUIDString


Tidak ada lagi cara untuk mengidentifikasi perangkat secara unik setelah pengguna menghapus pemasangan aplikasi. Dokumentasi mengatakan:

Nilai dalam properti ini tetap sama saat aplikasi (atau aplikasi lain dari vendor yang sama) diinstal pada perangkat iOS. Nilai berubah ketika pengguna menghapus semua aplikasi vendor dari perangkat dan kemudian menginstal ulang satu atau lebih dari itu.


Anda mungkin juga ingin membaca artikel ini oleh Mattt Thompson untuk lebih jelasnya:
http://nshipster.com/uuid-udid-unique-identifier/

Pembaruan untuk Swift 4.1 , Anda harus menggunakan:

UIDevice.current.identifierForVendor?.uuidString

mungkin menambahkan .UUIDString sehingga benar-benar dapat dikirim ke server?
Daniel Galasko

2
Ya. Saya pikir itu adalah hal yang jelas untuk dilakukan, tetapi saya memasukkannya dalam jawaban.
Atomix

19
Setelah aplikasi copot nomor ini tidak sama lagi. Apakah ada cara untuk melacak perangkat bahkan setelah aplikasi dihapus?
jmcastel

5
pertanyaan yang lebih baik adalah, jika dihapus setelah dihapus, bagaimana Anda menghapus akun mereka di server Anda ketika ID tidak lagi digunakan?
Jason G

2
@UmairAfzal Banyak hal yang tidak berfungsi di simulator. Apakah Anda mencobanya di perangkat nyata?
Atomix

10

Anda dapat menggunakan properti publik identifierForVendor yang ada di kelas UIDevice

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

EDIT Swift 3:

UIDevice.current.identifierForVendor!.uuidString

AKHIR EDIT

Cuplikan layar untuk hierarki properti


3
Ini hanya salinan jawaban @Atomix
Ashley Mills

10

Untuk Swift 3.X Kode Kerja Terbaru, Mudah digunakan;

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

3
Ini berubah setiap kali menggunakan uninstall dan instal aplikasi lagi.
iPeter

7
Ini hanya salinan jawaban @Atomix & JayprakasDubey
Ashley Mills

10

Anda dapat menggunakan devicecheck (dalam Swift 4) dokumentasi 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" ...
    }
}

Penggunaan umum:

Biasanya, Anda menggunakan API DeviceCheck untuk memastikan bahwa pengguna baru belum menebus tawaran dengan nama pengguna yang berbeda di perangkat yang sama.

Kebutuhan tindakan server:

Lihat WWDC 2017 - Sesi 702

lebih banyak dari artikel Santosh Botre - Pengidentifikasi Unik untuk Perangkat iOS

Server terkait Anda menggabungkan token ini dengan kunci otentikasi yang Anda terima dari Apple dan menggunakan hasilnya untuk meminta akses ke bit per perangkat.


1
Jika saya memahaminya dengan benar, pembuatan token dilakukan menggunakan DCDevice.generateToken (), dan setiap panggilan menghasilkan unik, acak device_token. Karenanya, device_token tidak gigih, tetapi fana. Yang tidak saya mengerti adalah bagaimana server dapat mengaitkan token fana dengan perangkat.
user1118764

@ user1118764 "Tetapkan dua bit - Server aplikasi akan bertanggung jawab untuk membagikan token ini dan mengatur nilai bit." baca lebih lanjut di sini medium.com/@santoshbotre01/… dan juga di sini dari developer dokumentasi
resmi.apple.com/documentation/devicecheck/…

1

Cepat 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
Tidak ada gunanya jika pengguna menghapus aplikasi karena kesalahan pengguna juga bisa dihapus dengan penghapusan instalasi aplikasi.
Rehan Ali

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

1
Silakan komentar kode Anda dan / atau detail penawaran dan penjelasan tentang bagaimana ini memecahkan pertanyaan yang diposting.
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

Nilai pengidentifikasiForVendor berubah ketika pengguna menghapus semua aplikasi vendor dari perangkat, jika Anda ingin menyimpan ID unik bahkan untuk instalasi baru berikutnya, Anda dapat mencoba menggunakan fungsi berikut

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

Siapa yang pernah turun memilih jawaban ini, dapatkah Anda jelaskan mengapa turun ini memilih? getCommonPartOfApplicationBundleID (), readFromKeyChain, saveToKeyChain adalah metode kustom yang perlu Anda terapkan, saya belum menyertakan definisi yang berpikir untuk tidak menambah ukuran jawaban.
Shihab

Apakah nilai yang disimpan di gantungan kunci tetap ada saat aplikasi dihapus instalasinya?
Anees

1
@Anees, Anda benar jawaban saya tidak valid dari iOS 10.3 Beta 2, itu otomatis menghapus item gantungan kunci setelah aplikasi dihapus, jika tidak ada aplikasi bersama. Jadi akhirnya itu akan menjadi perilaku yang sama dengan methid identifierForVendor.
Shihab

-18

Saya sudah mencoba

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

sebagai gantinya

let UUID = NSUUID().UUIDString

dan itu berhasil.


30
NSUUID (). UUIDString akan memberi Anda string baru setiap kali
Eric
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.