Question UIDevice uniqueIdentifier Obsolète - Que faire maintenant?


Il vient de sortir que la propriété UIDevice uniqueIdentifier est obsolète dans iOS5 et ci-dessus. Aucune autre méthode ou propriété ne semble être disponible ou à venir.

Beaucoup de nos applications existantes dépendent étroitement de cette propriété pour identifier de manière unique un périphérique particulier. Quelqu'un peut-il suggérer des idées sur la façon dont nous pourrions gérer ce problème à l'avenir?

La suggestion de la documentation est ...

Considérations particulières

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

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


485
2017-08-09 08:27


origine


Réponses:


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

Mais vous voudrez peut-être que ce soit ne pas unique, i. e. il devrait rester le même lorsque l'utilisateur désinstalle et réinstalle l'application. Cela nécessite un peu d'effort, car l'identifiant par périphérique le plus fiable semble être l'adresse MAC. Vous pourriez interroger le MAC et l'utiliser comme UUID.

Modifier: On doit toujours interroger le MAC de la même interface, bien sûr. Je suppose que le meilleur pari est avec en0. Le MAC est toujours présent, même si l'interface n'a pas d'IP / est en panne.


269
2017-08-09 08:37



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

Vous pouvez trouver le code sur github


92
2017-08-22 08:40



Basé sur le lien proposé par @moonlight, j'ai fait plusieurs tests et il semble que ce soit la meilleure solution. Comme @DarkDust dit que 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 retournent toujours les mêmes valeurs.
Ci-dessous les tests que j'ai fait (avec le vrai périphérique):

#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 avoir retiré et   réinstallation de l'application XXXX7dc3c577446a2bcbd77935bdXXXX (Wi-Fi) après   enlever et installer l'application

J'espère que c'est utile.

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


61
2017-10-24 09:32



regarde ça,

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

avec cette façon nous pourrions éviter pour UUID loisirs avec réinstallation, et obtenez toujours le même UUID pour la même application même utilisateur désinstaller et réinstaller à nouveau.

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

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


56
2018-03-06 15:16



Créez votre propre UUID, puis stockez-le dans le trousseau. Ainsi, il persiste même lorsque votre application est désinstallée. Dans de nombreux cas, il persiste même si l'utilisateur migre entre des périphériques (par exemple, sauvegarde complète et restauration sur un autre périphérique).

En effet, il devient unique identifiant de l'utilisateur pour autant que tu sois concerné. (même 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 au tout premier lancement de votre application. Donc, après le premier lancement, nous pouvons simplement l'utiliser à partir du trousseau, pas besoin de le régénérer. La principale raison d’utiliser Keychain pour stocker est la suivante: UUID au trousseau, il persistera même si l'utilisateur désinstalle complètement l'application puis l'installe à nouveau. . Donc, c'est la façon permanente de le stocker, ce qui signifie que la clé sera unique tout le long.

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

Lors du lancement de l'application, incluez 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écharger le fichier SSKeychain.m et .h depuis sskeychain Faites glisser les fichiers SSKeychain.m et .h vers votre projet et ajoutez "Security.framework" à votre projet. Pour utiliser UUID par la suite, utilisez simplement:

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

46
2017-09-20 11:03



Peut-être que vous pouvez utiliser:

[UIDevice currentDevice].identifierForVendor.UUIDString

La documentation d'Apple décrit identifierForVender comme suit:

La valeur de cette propriété est la même pour les applications provenant du même fournisseur qui s'exécute sur le même périphérique. Une valeur différente est renvoyée pour les applications sur le même périphérique provenant de différents fournisseurs et pour les applications sur différents appareils, quel que soit le fournisseur.


17
2018-01-15 18:43



Vous voudrez peut-être envisager d'utiliser OpenUDID qui est un remplacement de la dépréciation UDID.

Fondamentalement, pour correspondre à la UDID, les fonctionnalités suivantes sont requises:

  1. unique ou suffisamment unique (une collision à faible probabilité est probablement très acceptable)
  2. persistance entre redémarrages, restaurations, désinstallations
  3. disponible dans toutes les applications de différents fournisseurs (utile pour acquérir des utilisateurs via les réseaux CPI) -

OpenUDID remplit ce qui précède et a même un mécanisme d'exclusion intégré pour examen ultérieur.

Vérifier http://OpenUDID.org il pointe vers le GitHub correspondant. J'espère que cela t'aides!

Comme une note de côté, je voudrais éviter toute alternative d'adresse MAC. Alors que l'adresse MAC apparaît comme une solution tentante et universelle, assurez-vous que ce fruit est empoisonné. L'adresse MAC est très sensible, et Apple peut très bien déprécier l'accès à celui-ci avant même de pouvoir dire "SOUMETTRE CETTE APP" ... l'adresse réseau MAC est utilisée pour authentifier certains périphériques sur des réseaux locaux privés (WLAN) réseaux (VPN). .. c'est encore plus sensible que l'ancien UDID!


14
2018-03-28 19:16



Je suis sûr qu'Apple a agacé beaucoup de gens avec ce changement. Je développe un application de comptabilité pour iOS et avoir un service en ligne pour synchroniser les modifications apportées sur différents appareils. Le service gère une base de données de tous les périphériques et les modifications qui doivent leur être transmises. Par conséquent, il est important de savoir quels appareils sont ceux. Je suis en train de suivre les appareils en utilisant l'identifiant unique UIDevice et pour ce que ça vaut, voici mes pensées.

  • Générer un UUID et stocker les valeurs par défaut de l'utilisateur? Pas bon, car cela ne persiste pas lorsque l'utilisateur supprime l'application. S'ils réinstallent plus tard, le service en ligne ne devrait pas créer un nouvel enregistrement de périphérique, ce qui gaspillerait des ressources sur le serveur et donnerait une liste de périphériques contenant le même disque deux fois ou plus. Les utilisateurs verraient plus d'un "iPhone de Bob" dans la liste s'ils réinstallaient l'application.

  • Générer un UUID et le stocker dans le trousseau? C'était mon plan, car il persiste même lorsque l'application est désinstallée. Mais lors de la restauration d'une sauvegarde iTunes sur un nouvel appareil iOS, le trousseau est transféré si la sauvegarde est cryptée. Cela pourrait conduire à deux périphériques contenant le même identifiant de périphérique si l'ancien et le nouveau périphérique sont tous deux en service. Celles-ci doivent être répertoriées comme deux périphériques dans le service en ligne, même si le nom du périphérique est le même.

  • Générer un hachage l'adresse MAC et l'identifiant du bundle? Cela ressemble à la meilleure solution pour ce dont j'ai besoin. En hachant avec l'identifiant de l'ensemble, l'identifiant de l'appareil généré ne permettra pas de suivre l'appareil entre les applications et je recevrai un identifiant unique pour la combinaison app + appareil.

Il est intéressant de noter que la propre documentation d’Apple fait référence à la validation Mac App Store reçoit une facture en calculant un hachage de l'adresse MAC du système, ainsi que l'identifiant et la version du bundle. Donc, cela semble permis par la politique, si elle passe par l'examen de l'application que je ne connais pas encore.


11
2018-04-13 15:10



Il ressemble à iOS 6, Apple vous recommande d’utiliser la classe NSUUID.

Du message maintenant dans le UIDevice docs pour uniqueIdentifier propriété:

Déconseillé dans iOS 5.0. Utilisez la propriété identifierForVendor de cette   classe ou la propriété advertisingIdentifier du ASIdentifierManager   class à la place, selon le cas, ou utilisez la méthode UUID du NSUUID   class pour créer un UUID et l'écrire dans la base de données par défaut de l'utilisateur.


11
2017-10-01 09:27