Acaba de salir a la luz que la propiedad UIDevice uniqueIdentifier está en desuso en iOS 5 y no está disponible en iOS 7 y versiones posteriores. Ningún método o propiedad alternativa parece estar disponible o disponible.
Muchas de nuestras aplicaciones existentes dependen mucho de esta propiedad para identificar de forma exclusiva un dispositivo en particular. ¿Cómo podríamos manejar este problema en el futuro?
La sugerencia de la documentación en 2011-2012 fue:
Consideraciones Especiales
No use la propiedad uniqueIdentifier. Para crear un identificador único específico para su aplicación, puede llamar a la
CFUUIDCreate
función para crear unUUID
y escribirlo en la base de datos predeterminada utilizando laNSUserDefaults
clase.
Sin embargo, este valor no será el mismo si un usuario desinstala y vuelve a instalar la aplicación.
fuente
Respuestas:
Un UUID creado por
CFUUIDCreate
es único si un usuario desinstala y vuelve a instalar la aplicación: obtendrá uno nuevo cada vez.Pero es posible que desee que no sea único, es decir, que permanezca igual cuando el usuario desinstale y vuelva a instalar la aplicación. Esto requiere un poco de esfuerzo, ya que el identificador por dispositivo más confiable parece ser la dirección MAC. Puede consultar el MAC y usarlo como UUID.Editar: Uno siempre debe consultar el MAC de la misma interfaz, por supuesto. Supongo que la mejor apuesta es conen0
. El MAC siempre está presente, incluso si la interfaz no tiene IP / está inactivo.Edición 2: Como lo señalaron otros, la solución preferida desde iOS 6 es - [UIDevice identifierForVendor] . En la mayoría de los casos, debería poder usarlo como un reemplazo directo al anterior
-[UIDevice uniqueIdentifier]
(pero Apple parece querer crear un UUID que se crea cuando se inicia por primera vez).Edición 3: para que este punto principal no se pierda en el ruido del comentario: no use el MAC como UUID, cree un hash usando el MAC . Ese hash siempre creará el mismo resultado cada vez, incluso a través de reinstalaciones y aplicaciones (si el hash se realiza de la misma manera). De todos modos, hoy en día (2013) esto ya no es necesario, excepto si necesita un identificador de dispositivo "estable" en iOS <6.0.Edición 4: en iOS 7, Apple ahora siempre devuelve un valor fijo cuando consulta el MAC para frustrar específicamente el MAC como base para un esquema de ID . Entonces, ahora realmente debería usar - [UIDevice identifierForVendor] o crear un UUID por instalación.
fuente
Ya puedes usar tu alternativa para Apple
UDID
. Kind Guy Gekitz escribió una categoría en laUIDevice
que generará algún tipo deUDID
dirección de dispositivo basada en la dirección MAC y el identificador de paquete.Puedes encontrar el código en github
fuente
02:00:00:00:00:00
cuando solicita la dirección MAC en cualquier dispositivo. Verifique aquí: developer.apple.com/library/prerelease/ios/releasenotes/General/…Basado en el enlace propuesto por @moonlight, hice varias pruebas y parece ser la mejor solución. Como dice @DarkDust, el método va a verificar
en0
cuál está siempre disponible.Hay 2 opciones:
uniqueDeviceIdentifier
(MD5 de MAC + CFBundleIdentifier)y
uniqueGlobalDeviceIdentifier
(MD5 de MAC), estas siempre devuelven los mismos valores.Debajo de las pruebas que he hecho (con el dispositivo real):
Espero que sea útil.
EDITAR:
como señalaron otros, esta solución en iOS 7 ya no es útil ya
uniqueIdentifier
que ya no está disponible y la consulta de la dirección MAC ahora siempre devuelve 02: 00: 00: 00: 00: 00fuente
mira esto,
podemos usar Keychain en lugar de
NSUserDefaults
class, para almacenarUUID
creado porCFUUIDCreate
.de esta manera podríamos evitar la
UUID
recreación con la reinstalación, y obtener siempre lo mismoUUID
para la misma aplicación, incluso la desinstalación y reinstalación del usuario nuevamente.UUID
se recreará justo cuando el usuario reinicie el dispositivo.Probé este método con SFHFKeychainUtils y funciona de maravilla .
fuente
kSecAttrAccessibleAlwaysThisDeviceOnly
. Esto asegurará que su UUID no migre a ningún otro dispositivo. Para acceder a su UUID desde otras aplicaciones, utilice lakSecAttrAccessGroup
clave.Cree su propio UUID y luego guárdelo en el llavero. Por lo tanto, persiste incluso cuando su aplicación se desinstala. En muchos casos, también persiste incluso si el usuario migra entre dispositivos (por ejemplo, copia de seguridad completa y restauración a otro dispositivo).
Efectivamente, se convierte en un identificador de usuario único en lo que a usted respecta. (incluso mejor que el identificador del dispositivo ).
Ejemplo:
Estoy definiendo un método personalizado para crear un
UUID
como:Luego puede almacenarlo en
KEYCHAIN
el primer lanzamiento de su aplicación. De modo que después del primer lanzamiento, simplemente podemos usarlo desde el llavero, sin necesidad de regenerarlo. La razón principal para usar Keychain para almacenar es: cuando configuras elUUID
Keychain, persistirá incluso si el usuario desinstala completamente la aplicación y luego la instala nuevamente. . Entonces, esta es la forma permanente de almacenarlo, lo que significa que la clave será única en todo momento.En el lanzamiento de la aplicación, incluya el siguiente código:
Descargue el archivo SSKeychain.m y .h de sskeychain y arrastre el archivo SSKeychain.m y .h a su proyecto y agregue "Security.framework" a su proyecto. Para usar UUID luego simplemente use:
fuente
Quizás puedas usar:
La documentación de Apple describe identifierForVender de la siguiente manera:
El valor de esta propiedad es el mismo para las aplicaciones que provienen del mismo proveedor que se ejecuta en el mismo dispositivo. Se devuelve un valor diferente para aplicaciones en el mismo dispositivo que provienen de diferentes proveedores y para aplicaciones en diferentes dispositivos, independientemente del proveedor.
fuente
Es posible que desee considerar el uso de
OpenUDID
un reemplazo directo para el obsoletoUDID
.Básicamente, para que coincida con
UDID
, se requieren las siguientes características:OpenUDID
cumple con lo anterior e incluso tiene un mecanismo de exclusión incorporado para su posterior consideración.Verifique http://OpenUDID.org , apunta al GitHub correspondiente. ¡Espero que esto ayude!
Como nota al margen, rehuiría cualquier alternativa de dirección MAC. Si bien la dirección MAC aparece como una solución tentadora y universal, asegúrese de que esta fruta baja esté envenenada. La dirección MAC es muy sensible, y Apple puede desaprobar el acceso a esta antes de que incluso puedas decir "ENVIAR ESTA APLICACIÓN" ... la dirección de red MAC se usa para autenticar ciertos dispositivos en redes privadas (WLAN) u otras redes privadas virtuales. redes (VPN). ¡Es aún más sensible que el antiguo UDID!
fuente
Estoy seguro de que Apple ha molestado a muchas personas con este cambio. Desarrollo una aplicación de contabilidad para iOS y tengo un servicio en línea para sincronizar los cambios realizados en diferentes dispositivos. El servicio mantiene una base de datos de todos los dispositivos y los cambios que deben propagarse a ellos. Por lo tanto, es importante saber qué dispositivos son cuáles. Estoy haciendo un seguimiento de los dispositivos que usan el UIDevice uniqueIdentifier y, por lo que vale, aquí están mis pensamientos.
¿Generar un UUID y almacenar en los valores predeterminados del usuario? No es bueno porque esto no persiste cuando el usuario elimina la aplicación. Si se instalan nuevamente más tarde, el servicio en línea no debería crear un nuevo registro de dispositivo, eso desperdiciaría recursos en el servidor y daría una lista de dispositivos que contienen el mismo dos o más veces. Los usuarios verán más de un "iPhone de Bob" en la lista si reinstalan la aplicación.
¿Generar un UUID y almacenarlo en el llavero? Este era mi plan, ya que persiste incluso cuando la aplicación se desinstala. Pero cuando se restaura una copia de seguridad de iTunes en un nuevo dispositivo iOS, el llavero se transfiere si la copia de seguridad está encriptada. Esto podría llevar a dos dispositivos que contengan la misma identificación de dispositivo si los dispositivos antiguos y nuevos están en servicio. Estos deben aparecer como dos dispositivos en el servicio en línea, incluso si el nombre del dispositivo es el mismo.
¿Generar un hash la dirección MAC y la identificación del paquete? Esta parece la mejor solución para lo que necesito. Al analizar el ID del paquete, el ID del dispositivo generado no permitirá que el dispositivo pueda rastrearse en todas las aplicaciones y obtengo una ID única para la combinación de la aplicación y el dispositivo.
Es interesante observar que la propia documentación de Apple se refiere a la validación de los recibos de la Mac App Store al calcular un hash de la dirección MAC del sistema más la identificación y la versión del paquete. Por lo tanto, esto parece permitido por la política, ya sea que pase por la revisión de la aplicación, aún no lo sé.
fuente
kSecAttrAccessibleAlwaysThisDeviceOnly
. Esto asegurará que su UUID no se restaure a otros dispositivos, incluso si la copia de seguridad está encriptada.Parece que para iOS 6, Apple recomienda que uses la clase NSUUID .
Del mensaje ahora en los documentos UIDevice para la
uniqueIdentifier
propiedad:fuente
Puede ayudar: use el siguiente código, siempre será Único, excepto que borre (Formatee) su dispositivo.
fuente
También sugeriría cambiar
uniqueIdentifier
a esta biblioteca de código abierto (2 categorías simples realmente) que utilizan la dirección MAC del dispositivo junto con el identificador de paquete de aplicaciones para generar una identificación única en sus aplicaciones que se puede usar como reemplazo de UDID.Tenga en cuenta que, a diferencia del UDID, este número será diferente para cada aplicación.
Usted sólo tendrá que importar los incluidos
NSString
yUIDevice
categorías y llamada[[UIDevice currentDevice] uniqueDeviceIdentifier]
así:Puedes encontrarlo en Github aquí:
UIDevice con UniqueIdentifier para iOS 5
Aquí están las categorías (solo los archivos .m - verifique el proyecto github para los encabezados):
fuente
Puede lograr con este código: UIDevice-with-UniqueIdentifier-for-iOS-5
fuente
La dirección MAC puede ser falsificada, lo que hace que este enfoque sea inútil para vincular contenido a usuarios específicos o implementar características de seguridad como listas negras.
Después de algunas investigaciones adicionales, me parece que nos quedamos sin una alternativa adecuada a partir de ahora. Espero seriamente que Apple reconsidere su decisión.
Tal vez sería una buena idea enviar un correo electrónico a Apple sobre este tema y / o presentar una solicitud de error / función sobre esto, ya que tal vez ni siquiera son conscientes de las consecuencias completas para los desarrolladores.
fuente
UIDevice identifierForVendor
introducido en iOS 6 funcionaría para sus propósitos.identifierForVendor
es una cadena alfanumérica que identifica de forma exclusiva un dispositivo para el proveedor de la aplicación. (solo lectura)El valor de esta propiedad es el mismo para las aplicaciones que provienen del mismo proveedor que se ejecuta en el mismo dispositivo. Se devuelve un valor diferente para aplicaciones en el mismo dispositivo que provienen de diferentes proveedores, y para aplicaciones en diferentes dispositivos con respecto al proveedor.
Disponible en iOS 6.0 y posterior y declarado en
UIDevice.h
Para iOS 5, consulte este enlace UIDevice-with-UniqueIdentifier-for-iOS-5
fuente
Usando el SSKeychain y el código mencionado anteriormente. Aquí hay código para copiar / pegar (agregar el módulo SSKeychain):
}
fuente
El siguiente código ayuda a obtener UDID:
fuente
Este es el código que estoy usando para obtener ID tanto para iOS 5 como para iOS 6, 7:
fuente
PerformSelector may cause a leak because its selector is unknown
?Desde iOS 6 en adelante, tenemos una
NSUUID
clase que cumple con RFC4122Enlace de Apple: apple_ref para NSUUID
fuente
iOS 11 ha introducido el marco DeviceCheck. Tiene una solución a prueba de fallas para identificar de forma única el dispositivo.
fuente
Una forma de trabajar para obtener UDID:
Un ejemplo usando RoutingHTTPServer :
Aquí están los contenidos de
udid.mobileconfig
:La instalación del perfil fallará (no me molesté en implementar una respuesta esperada, consulte la documentación ), pero la aplicación obtendrá un UDID correcto. Y también debe firmar la configuración móvil .
fuente
Para Swift 3.0, utilice el siguiente código.
fuente
Puedes usar
Que es único para el dispositivo en todas las aplicaciones.
fuente
Apple ha agregado un nuevo marco en iOS 11 llamado DeviceCheck que lo ayudará a obtener el identificador único muy fácilmente. Lea este formulario más información. https://medium.com/@santoshbotre01/unique-identifier-for-the-ios-devices-590bb778290d
fuente
Si alguien se topa con esta pregunta, cuando busca una alternativa. He seguido este enfoque en
IDManager
clase. Esta es una colección de diferentes soluciones. KeyChainUtil es un contenedor para leer del llavero. También puede usar elhashed MAC address
como una especie de identificación única.fuente
fuente
Podemos usar identifierForVendor para ios7,
--Nota IMPORTANTE ---
UDID e identifierForVendor son diferentes: ---
fuente
Apple ha ocultado el UDID de todas las API públicas, comenzando con iOS 7. Cualquier UDID que comience con FFFF es una identificación falsa. Las aplicaciones "Enviar UDID" que funcionaban anteriormente ya no se pueden usar para recopilar UDID para dispositivos de prueba. (¡suspiro!)
El UDID se muestra cuando un dispositivo está conectado a XCode (en el organizador) y cuando el dispositivo está conectado a iTunes (aunque debe hacer clic en 'Número de serie' para que se muestre el identificador).
Si necesita obtener el UDID de un dispositivo para agregarlo a un perfil de aprovisionamiento, y no puede hacerlo usted mismo en XCode, deberá guiarlos a través de los pasos para copiarlo / pegarlo desde iTunes.
¿Existe alguna forma desde (lanzamiento de iOS 7) para obtener el UDID sin usar iTunes en una PC / Mac?
fuente
También tuve un problema, y la solución es simple:
fuente
Una alternativa no perfecta pero una de las mejores y más cercanas a UDID (en Swift con iOS 8.1 y Xcode 6.1):
Generando un UUID aleatorio
Y use la biblioteca KeychainWrapper :
Agregue un valor de cadena al llavero:
Recupere un valor de cadena del llavero:
Eliminar un valor de cadena del llavero:
Esta solución utiliza el llavero, por lo que el registro almacenado en el llavero se mantendrá, incluso después de que la aplicación se desinstale y reinstale. La única forma de eliminar este registro es restablecer todos los contenidos y configuraciones del dispositivo. Es por eso que mencioné que esta solución de sustitución no es perfecta, pero sigue siendo una de las mejores soluciones de reemplazo para UDID en iOS 8.1 usando Swift.
fuente
NSLog (@ "% @", [[UIDevice currentDevice] identifierForVendor]);
fuente