505 votes

UIDevice uniqueIdentifier deprecated - Que faire maintenant ?

On vient de découvrir que La propriété UIDevice uniqueIdentifier est obsolète. sur iOS 5 et non disponible dans iOS 7 et supérieur. Aucune méthode ou propriété alternative ne semble être disponible ou à venir.

Un grand nombre de nos applications existantes dépendent étroitement de cette propriété pour identifier de manière unique un appareil particulier. Comment pourrions-nous gérer ce problème à l'avenir ?

La suggestion de la documentation en 2011-2012 était :

Considérations particulières

N'utilisez pas la propriété uniqueIdentifier. Pour créer un identifiant unique spécifique à votre application, vous pouvez appeler la propriété CFUUIDCreate pour créer un UUID et écrire dans la base de données par défaut en utilisant la commande NSUserDefaults classe.

Toutefois, cette valeur ne sera pas la même si un utilisateur désinstalle et réinstalle l'application.

1 votes

Pour les applications qui utilisent toujours uniqueIdentifier, iOS7 renvoie maintenant FFFFFFFF + identifierForVendor, ce qui casse un grand nombre d'applications d'abonnement non renouvelable mal écrites.

0 votes

Si par chance votre application utilise les notifications push, vous pouvez utiliser le jeton renvoyé par le service push d'Apple, il est également unique pour chaque appareil.

0 votes

@CalinChitu Si l'utilisateur n'accepte pas les notifications push, obtenez-vous quand même un pushID pour cet utilisateur ?

274voto

DarkDust Points 47584

Un UUID créé par CFUUIDCreate est unique si un utilisateur désinstalle et réinstalle l'application : vous en recevrez une nouvelle à chaque fois.

Mais vous pourriez vouloir que ce soit no unique, c'est-à-dire qu'il doit rester le même lorsque l'utilisateur désinstalle et réinstalle l'application. Cela demande un peu d'effort, car l'identifiant le plus fiable par appareil semble être l'adresse MAC. Vous pourriez interroger le MAC et l'utiliser comme UUID.

Edit : Il faut bien sûr toujours interroger le MAC de la même interface. Je pense que la meilleure solution est de en0 . Le MAC est toujours présent, même si l'interface n'a pas d'IP/est hors service.

Edit 2 : Comme l'ont souligné d'autres personnes, la solution préférée depuis iOS 6 est la suivante -[UIDevice identifierForVendor] . Dans la plupart des cas, vous devriez pouvoir l'utiliser en remplacement de l'ancien système de gestion des déchets. -[UIDevice uniqueIdentifier] (mais un UUID qui est créé lorsque l'application démarre pour la première fois est ce qu'Apple semble vouloir que vous utilisiez).

Edit 3 : Pour que ce point majeur ne se perde pas dans le bruit des commentaires : n'utilisez pas l'option MAC comme UUID, créez un hachage en utilisant le MAC . Ce hachage donnera toujours le même résultat, même en cas de réinstallation et d'utilisation d'applications (si le hachage est effectué de la même manière). Quoi qu'il en soit, de nos jours (2013), ce n'est plus nécessaire, sauf si vous avez besoin d'un identifiant d'appareil "stable" sur iOS < 6.0.

Edit 4 : Dans iOS 7, Apple renvoie désormais toujours une valeur fixe lors de l'interrogation du MAC afin de contrecarrer spécifiquement l'utilisation de l'option MAC comme base pour un ID système. Vous devriez donc maintenant vraiment utiliser -[UIDevice identifierForVendor] ou créer un UUID par installation.

8 votes

L'adresse mac ne change-t-elle pas selon que l'utilisateur est connecté en Wifi ou non ?

0 votes

Non, l'IP le fait, mais pas le MAC. Le site Le MAC est unique à l'interface .

1 votes

@DarkDust : mais puisque l'interface active change lorsque vous passez du wifi au modem cellulaire, l'adresse MAC de l'interface active devrait également changer ; à moins que vous ne choisissiez toujours une interface particulière pour obtenir l'adresse MAC.

92voto

moonlight Points 3036

Vous pouvez utiliser votre alternative pour Apple UDID déjà. Le gentil gekitz a écrit une catégorie le UIDevice qui générera une sorte de UDID basé sur l'adresse mac de l'appareil et l'identifiant du paquet.

Vous pouvez trouver le code sur github

3 votes

Cette implémentation est unique (adresse MAC) pour un appareil à travers les réinstallations, comme l'uniqueId d'Apple, mais respecte aussi la vie privée, étant aussi unique pour une application (utiliser aussi bundleId)... Un must have imho, qu'Apple devrait inclure dans ses APIs... au lieu de les déprécier sans aucune alternative.

8 votes

Bien qu'il utilise la vieille licence bsd avec la clause de publicité, beurk.

8 votes

Pour tous ceux qui trouvent cet article maintenant, la licence a été modifiée depuis le commentaire de jbtule.

62voto

Mat Points 5385

Sur la base du lien proposé par @moonlight, j'ai fait plusieurs tests et il semble que ce soit la meilleure solution. Comme le dit @DarkDust la méthode va vérifier en0 qui est toujours disponible.
Il y a 2 options :
uniqueDeviceIdentifier (MD5 de MAC+CFBundleIdentifier)
et uniqueGlobalDeviceIdentifier (MD5 du MAC), ceux-ci renvoient toujours les mêmes valeurs.
Ci-dessous les tests que j'ai effectués (avec l'appareil réel) :

#import "UIDevice+IdentifierAddition.h"

NSLog(@"%@",[[UIDevice currentDevice] uniqueDeviceIdentifier]);
NSLog(@"%@",[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]);

XXXX21f1f19edff198e2a2356bf4XXXX - (WIFI)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (WIFI)GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (3G)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (3G)GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (GPRS)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (GPRS)GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (mode AirPlane)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (mode AirPlane)GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (Wi-Fi)après la suppression et la réinstallation de l'app. réinstallation de l'application XXXX7dc3c577446a2bcbd77935bdXX (Wi-Fi) après avoir suppression et installation de l'application

J'espère que cela vous sera utile.

EDIT :
Comme d'autres l'ont souligné, cette solution dans iOS 7 n'est plus utile puisque uniqueIdentifier n'est plus disponible et l'interrogation de l'adresse MAC renvoie toujours 02:00:00:00:00:00:00.

13 votes

Cela ne fonctionnera pas sur iOS7, Apple élimine l'utilisation de l'adresse MAC.

0 votes

@SarimSidd Pour l'instant, les informations sur iOS 7 sont sous NDA, nous ne pouvons pas en discuter ici.

58voto

ytur Points 782

Regarde ça,

nous pouvons utiliser Keychain au lieu de NSUserDefaults pour stocker UUID créé par CFUUIDCreate .

de cette façon, nous pourrions éviter que UUID récréation avec la réinstallation, et obtenir toujours le même UUID pour la même application, même si l'utilisateur désinstalle et réinstalle à nouveau.

UUID sera recréé juste quand le dispositif sera réinitialisé par l'utilisateur.

J'ai essayé cette méthode avec SFHFKeychainUtils et ça marche comme un charme.

33 votes

Cette méthode constitue un remplacement solide de l'UDID. Elle présente également l'avantage de recréer l'identifiant au format de l'appareil (par exemple, si l'appareil change de propriétaire). Cependant, il est important de noter que le trousseau de clés peut être restauré sur d'autres appareils si l'utilisateur crypte sa sauvegarde. Cela peut entraîner une situation où plusieurs appareils partagent le même UUID. Pour éviter cela, définissez l'accessibilité de votre élément de trousseau de clés sur kSecAttrAccessibleAlwaysThisDeviceOnly . Cela permettra de s'assurer que votre UUID ne migre pas vers un autre appareil. Pour accéder à votre UUID à partir d'autres applications, utilisez la fonction kSecAttrAccessGroup clé.

0 votes

Où exactement (quelle clé) êtes-vous censé utiliser pour stocker l'UUID dans le trousseau ?

0 votes

Opps ! le lien est cassé

49voto

Samir Jwarchan Points 641

Créez votre propre UUID, puis stockez-le dans le trousseau de clés. Ainsi, il persiste même lorsque votre application est désinstallée. Dans de nombreux cas, il est également conservé même si l'utilisateur migre d'un appareil à l'autre (par exemple, en cas de sauvegarde complète et de restauration sur un autre appareil).

En effet, il devient un unique identifiant de l'utilisateur en ce qui vous concerne. (encore mieux que dispositif identifiant).

Exemple :

Je suis en train de définir une méthode personnalisée pour créer un UUID comme :

- (NSString *)createNewUUID 
{
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}

Vous pouvez ensuite le stocker dans KEYCHAIN lors du tout premier lancement de votre application. Ainsi, après le premier lancement, nous pouvons simplement l'utiliser à partir du trousseau de clés, sans avoir besoin de le régénérer. La principale raison d'utiliser le trousseau pour stocker est : Lorsque vous définissez le UUID dans le trousseau, il persistera même si l'utilisateur désinstalle complètement l'application et l'installe à nouveau. . C'est donc la façon permanente de la stocker, ce qui signifie que la clé sera toujours unique.

     #import "SSKeychain.h"
     #import <Security/Security.h>

Sur le lancement de l'application, inclure le code suivant :

 // getting the unique key (if present ) from keychain , assuming "your app identifier" as a key
       NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];
      if (retrieveuuid == nil) { // if this is the first time app lunching , create key for device
        NSString *uuid  = [self createNewUUID];
// save newly created key to Keychain
        [SSKeychain setPassword:uuid forService:@"your app identifier" account:@"user"];
// this is the one time process
}

Téléchargez le fichier SSKeychain.m et .h à partir de sskeychain et faites glisser les fichiers SSKeychain.m et .h dans votre projet et ajoutez "Security.framework" à votre projet. Pour utiliser l'UUID ensuite, utilisez simplement :

NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];

0 votes

Parce que l'identifiantForVendor ne fonctionne pas parfaitement. Dans certains cas, il peut retourner un nil ou 0x0. Cette méthode semble fonctionner parfaitement

3 votes

Quelqu'un a validé que cela fonctionne sur iOS7 après un cycle de désinstallation/réinstallation + soumission vérifiée de l'application apple ?

0 votes

J'ai commencé à utiliser cette solution. Plusieurs tests sur 2 appareils (reconstruction, réinstallation, arrêt de l'appareil) m'ont montré que l'id est le même. iOS 10.3.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X