Baru saja terungkap bahwa properti UIDevice uniqueIdentifier sudah ditinggalkan di iOS 5 dan tidak tersedia di iOS 7 dan di atasnya. Tidak ada metode atau properti alternatif yang tampaknya tersedia atau akan datang.
Banyak aplikasi kami yang ada sangat tergantung pada properti ini untuk mengidentifikasi perangkat tertentu secara unik. Bagaimana kita menangani masalah ini ke depan?
Saran dari dokumentasi pada 2011-2012 adalah:
Pertimbangan Khusus
Jangan gunakan properti uniqueIdentifier. Untuk membuat pengidentifikasi unik khusus untuk aplikasi Anda, Anda dapat memanggil
CFUUIDCreate
fungsi untuk membuatUUID
, dan menulisnya ke database default menggunakanNSUserDefaults
kelas.
Namun nilai ini tidak akan sama jika pengguna mencopot pemasangan dan menginstal ulang aplikasi.
sumber
Jawaban:
Sebuah UUID yang dibuat oleh
CFUUIDCreate
adalah unik jika pencopotan pemasangan pengguna dan re-menginstal aplikasi: Anda akan mendapatkan yang baru setiap kali.Tetapi Anda mungkin ingin itu tidak unik, yaitu harus tetap sama ketika pengguna mencopot pemasangan dan menginstal ulang aplikasi. Ini membutuhkan sedikit usaha, karena pengidentifikasi per-perangkat yang paling dapat diandalkan tampaknya adalah alamat MAC. Anda dapat meminta MAC dan menggunakannya sebagai UUID.Sunting: Orang perlu selalu menanyakan MAC dari antarmuka yang sama, tentu saja. Saya kira taruhan terbaik adalah denganen0
. MAC selalu ada, bahkan jika antarmuka tidak memiliki IP / turun.Sunting 2: Seperti yang ditunjukkan oleh orang lain, solusi yang lebih disukai karena iOS 6 adalah - [UIDevice identifierForVendor] . Dalam kebanyakan kasus, Anda harus dapat menggunakannya sebagai pengganti drop-in ke yang lama
-[UIDevice uniqueIdentifier]
(tetapi UUID yang dibuat ketika aplikasi dimulai untuk pertama kalinya adalah apa yang Apple ingin Anda gunakan).Sunting 3: Jadi poin utama ini tidak hilang dalam kebisingan komentar: jangan gunakan MAC sebagai UUID, buat hash menggunakan MAC . Hash itu akan selalu menciptakan hasil yang sama setiap kali, bahkan di seluruh menginstal ulang dan aplikasi (jika hashing dilakukan dengan cara yang sama). Bagaimanapun, saat ini (2013) ini tidak diperlukan lagi kecuali jika Anda memerlukan pengenal perangkat "stabil" di iOS <6.0.Sunting 4: Di iOS 7, Apple sekarang selalu mengembalikan nilai tetap ketika meminta MAC untuk secara spesifik menggagalkan MAC sebagai basis untuk skema ID . Jadi Anda sekarang benar-benar harus menggunakan - [UIDevice identifierForVendor] atau membuat UUID per-instal.
sumber
Anda sudah bisa menggunakan alternatif Anda untuk Apple
UDID
. Kind guy gekitz menulis kategoriUIDevice
yang akan menghasilkan beberapa jenisUDID
berdasarkan pada perangkat mac-address dan bundle identifier.Anda dapat menemukan kode di github
sumber
02:00:00:00:00:00
ketika Anda meminta alamat MAC pada perangkat apa pun. Periksa di sini: developer.apple.com/library/prerelease/ios/releasenotes/General/…Berdasarkan tautan yang diusulkan oleh @moonlight, saya melakukan beberapa tes dan sepertinya itu solusi terbaik. Seperti @DarkDust mengatakan metode ini untuk memeriksa
en0
yang selalu tersedia.Ada 2 opsi:
uniqueDeviceIdentifier
(MD5 dari MAC + CFBundleIdentifier)dan
uniqueGlobalDeviceIdentifier
(MD5 dari MAC), ini selalu mengembalikan nilai yang sama.Di bawah tes yang telah saya lakukan (dengan perangkat asli):
Semoga bermanfaat.
EDIT:
Seperti yang ditunjukkan orang lain, solusi ini di iOS 7 tidak lagi berguna karena
uniqueIdentifier
tidak lagi tersedia dan permintaan untuk alamat MAC sekarang kembali selalu 02: 00: 00: 00: 00: 00: 00sumber
lihat ini,
kita bisa menggunakan Keychain alih-alih
NSUserDefaults
kelas, untuk menyimpan yangUUID
dibuat olehCFUUIDCreate
.dengan cara ini kita dapat menghindari untuk
UUID
rekreasi dengan menginstal ulang, dan mendapatkan selalu samaUUID
untuk aplikasi yang sama bahkan pengguna menghapus dan menginstal ulang lagi.UUID
akan dibuat ulang tepat saat perangkat disetel ulang oleh pengguna.Saya mencoba metode ini dengan SFHFKeychainUtils dan ini berfungsi seperti pesona.
sumber
kSecAttrAccessibleAlwaysThisDeviceOnly
. Ini akan memastikan bahwa UUID Anda tidak bermigrasi ke perangkat lain. Untuk mengakses UUID Anda dari aplikasi lain, gunakankSecAttrAccessGroup
kuncinya.Buat UUID Anda sendiri dan kemudian simpan di Keychain. Dengan demikian itu tetap ada bahkan ketika aplikasi Anda dihapus instalasinya. Dalam banyak kasus itu juga tetap ada bahkan jika pengguna bermigrasi di antara perangkat (mis. Cadangan penuh dan mengembalikan ke perangkat lain).
Secara efektif itu menjadi pengidentifikasi pengguna unik sejauh yang Anda khawatirkan. (bahkan lebih baik daripada pengenal perangkat ).
Contoh:
Saya mendefinisikan metode khusus untuk membuat
UUID
sebagai:Anda kemudian dapat menyimpannya
KEYCHAIN
pada saat peluncuran aplikasi Anda yang pertama. Sehingga setelah peluncuran pertama, kita cukup menggunakannya dari gantungan kunci, tidak perlu dibuat ulang. Alasan utama untuk menggunakan Keychain untuk menyimpan adalah: Ketika Anda mengaturUUID
ke Keychain, itu akan tetap ada bahkan jika pengguna benar-benar menghapus instalan Aplikasi dan kemudian menginstalnya lagi. . Jadi, ini adalah cara permanen menyimpannya, yang berarti kuncinya akan unik sepanjang jalan.Pada peluncuran aplikasi termasuk kode berikut:
Unduh file SSKeychain.m dan .h dari sskeychain dan Tarik file SSKeychain.m dan .h ke proyek Anda dan tambahkan "Security.framework" ke proyek Anda. Untuk menggunakan UUID sesudahnya cukup gunakan:
sumber
Mungkin Anda bisa menggunakan:
Dokumentasi Apple menjelaskan identifierForVender sebagai berikut:
Nilai properti ini sama untuk aplikasi yang berasal dari vendor yang sama yang berjalan di perangkat yang sama. Nilai yang berbeda dikembalikan untuk aplikasi pada perangkat yang sama yang berasal dari vendor yang berbeda, dan untuk aplikasi pada perangkat yang berbeda terlepas dari vendor.
sumber
Anda mungkin ingin mempertimbangkan untuk menggunakan
OpenUDID
pengganti drop-in untuk yang sudah usangUDID
.Pada dasarnya, untuk mencocokkan
UDID
, fitur berikut diperlukan:OpenUDID
memenuhi hal di atas dan bahkan memiliki mekanisme Opt-Out built-in untuk pertimbangan nanti.Periksa http://OpenUDID.org itu menunjuk ke GitHub yang sesuai. Semoga ini membantu!
Sebagai catatan, saya akan menghindar dari alternatif alamat MAC. Meskipun alamat MAC tampak seperti solusi yang menggoda dan universal, pastikan buah yang menggantung rendah ini diracuni. Alamat MAC sangat sensitif, dan Apple mungkin akan mencabut akses ke yang ini sebelum Anda bahkan dapat mengatakan "SUBMIT THIS APP" ... alamat jaringan MAC digunakan untuk mengautentikasi perangkat tertentu pada lans pribadi (WLAN) atau virtual private lainnya. jaringan (VPN). .. ini bahkan lebih sensitif daripada mantan UDID!
sumber
Saya yakin Apple telah mengganggu banyak orang dengan perubahan ini. Saya mengembangkan aplikasi pembukuan untuk iOS dan memiliki layanan online untuk menyinkronkan perubahan yang dibuat pada perangkat yang berbeda. Layanan memelihara database semua perangkat dan perubahan yang perlu disebarkan ke mereka. Karena itu penting untuk mengetahui perangkat mana yang mana. Saya melacak perangkat menggunakan UIDevice uniqueIdentifier dan untuk apa nilainya, inilah pemikiran saya.
Buat UUID dan simpan di default pengguna? Tidak bagus karena ini tidak berlanjut ketika pengguna menghapus aplikasi. Jika mereka menginstal lagi nanti layanan online seharusnya tidak membuat catatan perangkat baru, yang akan membuang sumber daya di server dan memberikan daftar perangkat yang berisi yang sama dua atau lebih kali. Pengguna akan melihat lebih dari satu "iPhone Bob" terdaftar jika mereka menginstal ulang aplikasi.
Buat UUID dan simpan di gantungan kunci? Ini adalah rencana saya, karena tetap ada bahkan ketika aplikasi dihapus. Tetapi ketika mengembalikan cadangan iTunes ke perangkat iOS baru, gantungan kunci ditransfer jika cadangan dienkripsi. Ini dapat menyebabkan dua perangkat yang berisi id perangkat yang sama jika perangkat lama dan baru keduanya dalam layanan. Ini harus terdaftar sebagai dua perangkat dalam layanan online, bahkan jika nama perangkat itu sama.
Hasilkan hash alamat MAC dan id bundel? Ini sepertinya solusi terbaik untuk apa yang saya butuhkan. Dengan hashing dengan bundle id, id perangkat yang dihasilkan tidak akan memungkinkan perangkat untuk dilacak di seluruh aplikasi dan saya mendapatkan ID unik untuk kombinasi aplikasi + perangkat.
Sangat menarik untuk dicatat bahwa dokumentasi Apple sendiri mengacu pada memvalidasi penerimaan Mac App Store dengan menghitung hash dari sistem alamat MAC ditambah id bundel dan versi. Jadi ini sepertinya diizinkan oleh kebijakan, apakah itu melewati ulasan aplikasi saya belum tahu.
sumber
kSecAttrAccessibleAlwaysThisDeviceOnly
. Ini akan memastikan bahwa UUID Anda tidak dikembalikan ke perangkat lain, bahkan jika cadangannya dienkripsi.Sepertinya untuk iOS 6, Apple merekomendasikan Anda menggunakan kelas NSUUID .
Dari pesan sekarang di dokumen UIDevice untuk
uniqueIdentifier
properti:sumber
Boleh bantu: gunakan kode di bawah ini akan selalu Unik kecuali Anda menghapus (Memformat) perangkat Anda.
sumber
Saya juga akan menyarankan berubah dari dari
uniqueIdentifier
ke perpustakaan open source ini (2 kategori sederhana benar-benar) yang memanfaatkan perangkat MAC Address bersama dengan App Bundle Identifier untuk menghasilkan ID unik dalam aplikasi Anda yang dapat digunakan sebagai pengganti UDID.Ingatlah bahwa tidak seperti UDID, angka ini akan berbeda untuk setiap aplikasi.
Anda hanya perlu mengimpor yang termasuk
NSString
danUIDevice
kategori dan menyebutnya[[UIDevice currentDevice] uniqueDeviceIdentifier]
seperti:Anda dapat menemukannya di Github di sini:
UIDevice dengan UniqueIdentifier untuk iOS 5
Berikut adalah kategorinya (hanya file .m - periksa proyek github untuk melihat headernya):
sumber
Anda dapat mencapai dari kode ini: UIDevice-with-UniqueIdentifier-for-iOS-5
sumber
Alamat MAC dapat dipalsukan yang membuat pendekatan seperti itu tidak berguna untuk mengikat konten ke pengguna tertentu atau mengimplementasikan fitur keamanan seperti daftar hitam.
Setelah beberapa penelitian lebih lanjut tampak bagi saya bahwa kita tidak memiliki alternatif yang tepat seperti sekarang Saya sungguh berharap Apple akan mempertimbangkan kembali keputusan mereka.
Mungkin itu ide yang baik untuk mengirim email ke Apple tentang topik ini dan / atau mengajukan permintaan bug / fitur tentang ini karena mungkin mereka bahkan tidak menyadari konsekuensi penuh untuk pengembang.
sumber
UIDevice identifierForVendor
diperkenalkan di iOS 6 akan berfungsi untuk tujuan Anda.identifierForVendor
adalah string alfanumerik yang secara unik mengidentifikasi perangkat ke vendor aplikasi. (hanya baca)Nilai properti ini sama untuk aplikasi yang berasal dari vendor yang sama yang berjalan di perangkat yang sama. Nilai yang berbeda dikembalikan untuk aplikasi pada perangkat yang sama yang berasal dari vendor yang berbeda, dan untuk aplikasi pada perangkat yang berbeda terkait dengan vendor.
Tersedia di iOS 6.0 dan yang lebih baru dan dinyatakan dalam
UIDevice.h
Untuk iOS 5 lihat tautan ini UIDevice-with-UniqueIdentifier-for-iOS-5
sumber
Menggunakan SSKeychain dan kode yang disebutkan di atas. Berikut kode untuk disalin / tempel (tambahkan modul SSKeychain):
}
sumber
Kode berikut membantu mendapatkan UDID:
sumber
Ini adalah kode yang saya gunakan untuk mendapatkan ID untuk iOS 5 dan iOS 6, 7:
sumber
PerformSelector may cause a leak because its selector is unknown
?Dari iOS 6 dan seterusnya, kami memiliki
NSUUID
kelas yang sesuai dengan RFC4122Tautan Apple: apple_ref untuk NSUUID
sumber
iOS 11 telah memperkenalkan kerangka kerja DeviceCheck. Ini memiliki solusi fullproof untuk mengidentifikasi perangkat secara unik.
sumber
Cara kerja untuk mendapatkan UDID:
Contoh menggunakan RoutingHTTPServer :
Berikut isinya
udid.mobileconfig
:Instalasi profil akan gagal (saya tidak repot-repot menerapkan respons yang diharapkan, lihat dokumentasi ), tetapi aplikasi akan mendapatkan UDID yang benar. Dan Anda juga harus menandatangani mobileconfig .
sumber
Untuk Swift 3.0 silakan gunakan kode di bawah ini.
sumber
Kamu bisa menggunakan
Yang unik untuk perangkat di semua aplikasi.
sumber
Apple telah menambahkan kerangka kerja baru di iOS 11 yang disebut DeviceCheck yang akan membantu Anda mendapatkan pengenal unik dengan sangat mudah. Baca formulir ini informasi lebih lanjut. https://medium.com/@santoshbotre01/unique-identifier-for-the-ios-devices-590bb778290d
sumber
Jika seseorang menemukan pertanyaan ini, ketika mencari alternatif. Saya telah mengikuti pendekatan ini di
IDManager
kelas, Ini adalah kumpulan dari solusi yang berbeda. KeyChainUtil adalah pembungkus untuk dibaca dari gantungan kunci. Anda juga dapat menggunakanhashed MAC address
sebagai jenis ID unik.sumber
sumber
Kita dapat menggunakan identifierForVendor untuk ios7,
--Catatan penting ---
UDID dan identifierForVendor berbeda: ---
sumber
Apple telah menyembunyikan UDID dari semua API publik, dimulai dengan iOS 7. UDID apa pun yang dimulai dengan FFFF adalah ID palsu. Aplikasi "Kirim UDID" yang sebelumnya berfungsi tidak dapat lagi digunakan untuk mengumpulkan UDID untuk perangkat uji. (mendesah!)
UDID ditampilkan ketika perangkat terhubung ke XCode (dalam agenda), dan ketika perangkat terhubung ke iTunes (meskipun Anda harus mengklik 'Serial Number' untuk mendapatkan Pengenal untuk ditampilkan.
Jika Anda perlu mendapatkan UDID agar perangkat ditambahkan ke profil bawaan, dan tidak bisa melakukannya sendiri di XCode, Anda harus mengikuti langkah-langkah untuk menyalin / menempelkannya dari iTunes.
Apakah ada cara sejak (rilis iOS 7) untuk mendapatkan UDID tanpa menggunakan iTunes di PC / Mac?
sumber
Saya juga punya masalah, dan solusinya sederhana:
sumber
Alternatif yang tidak sempurna tetapi salah satu yang terbaik dan terdekat dari UDID (di Swift menggunakan iOS 8.1 dan Xcode 6.1):
Menghasilkan UUID acak
Dan gunakan perpustakaan KeychainWrapper :
Tambahkan nilai string ke gantungan kunci:
Ambil nilai string dari gantungan kunci:
Hapus nilai string dari gantungan kunci:
Solusi ini menggunakan gantungan kunci, sehingga catatan yang disimpan dalam gantungan kunci akan bertahan, bahkan setelah aplikasi dihapus dan diinstal ulang. Satu-satunya cara menghapus catatan ini adalah dengan Reset semua konten dan pengaturan perangkat. Itulah mengapa saya menyebutkan bahwa solusi substitusi ini tidak sempurna tetapi tetap merupakan salah satu solusi terbaik pengganti UDID di iOS 8.1 menggunakan Swift.
sumber
NSLog (@ "% @", [[UIDevice currentDevice] identifierForVendor]);
sumber