Il vient de voir que la propriété UIDevice uniqueIdentifier est obsolète dans iOS 5 et non disponible dans iOS 7 et supérieur. Aucune méthode ou propriété alternative 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 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
CFUUIDCreate
fonction pour créer unUUID
et l'écrire dans la base de données par défaut à l'aide de laNSUserDefaults
classe.
Cependant, cette valeur ne sera pas la même si un utilisateur désinstalle et réinstalle l'application.
la source
Réponses:
Un UUID créé par
CFUUIDCreate
est unique si un utilisateur désinstalle et réinstalle l'application: vous en obtiendrez un nouveau à chaque fois.Mais vous voudrez peut-être qu'elle ne soit pas unique, c'est-à-dire qu'elle devrait rester la 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 pouvez interroger le MAC et l'utiliser comme UUID.Edit: Il faut toujours interroger le MAC de la même interface, bien sûr. Je suppose que le meilleur pari est avecen0
. Le MAC est toujours présent, même si l'interface n'a pas d'IP / est en panne.Edit 2: Comme cela a été souligné par d'autres, la solution préférée depuis iOS 6 est - [UIDevice identifierForVendor] . Dans la plupart des cas, vous devriez pouvoir l'utiliser en remplacement de l'ancien
-[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: Donc, ce point majeur ne se perd pas dans le bruit des commentaires: n'utilisez pas le MAC comme UUID, créez un hachage en utilisant le MAC . Ce hachage créera toujours le même résultat à chaque fois, même sur les réinstallations et les applications (si le hachage est effectué de la même manière). Quoi qu'il en soit, de nos jours (2013), cela 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 retourne désormais toujours une valeur fixe lors de l'interrogation du MAC pour contrecarrer spécifiquement le MAC comme base pour un schéma d' ID . Donc, vous devriez maintenant vraiment utiliser - [UIDevice identifierForVendor] ou créer un UUID par installation.
la source
Vous pouvez déjà utiliser votre alternative pour Apple
UDID
. Kind guy gekitz a écrit une catégorie surUIDevice
laquelle va générer une sorte d'UDID
adresse basée sur l'adresse mac et l'identifiant du bundle.Vous pouvez trouver le code sur github
la source
02:00:00:00:00:00
lorsque vous demandez l'adresse MAC sur n'importe quel appareil. Vérifiez ici: developer.apple.com/library/prerelease/ios/releasenotes/General/…Sur la base du lien proposé par @moonlight, j'ai fait plusieurs tests et cela semble être la meilleure solution. Comme le dit @DarkDust, la méthode vérifie
en0
laquelle est toujours disponible.Il y a 2 options:
uniqueDeviceIdentifier
(MD5 de MAC + CFBundleIdentifier)et
uniqueGlobalDeviceIdentifier
(MD5 de MAC), elles retournent toujours les mêmes valeurs.Ci-dessous les tests que j'ai effectués (avec le vrai appareil):
J'espère que c'est utile.
EDIT:
Comme d'autres l'ont souligné, cette solution dans iOS 7 n'est plus utile car elle
uniqueIdentifier
n'est plus disponible et la requête d'adresse MAC renvoie désormais toujours 02: 00: 00: 00: 00: 00la source
regarde ça,
nous pouvons utiliser le trousseau au lieu de la
NSUserDefaults
classe, pour stockerUUID
créé parCFUUIDCreate
.de cette façon, nous pourrions éviter pour les
UUID
loisirs avec la réinstallation, et obtenir toujours la même choseUUID
pour la même application, même l'utilisateur désinstaller et réinstaller.UUID
sera recréé au moment de la réinitialisation de l'appareil par l'utilisateur.J'ai essayé cette méthode avec SFHFKeychainUtils et cela fonctionne comme un charme.
la source
kSecAttrAccessibleAlwaysThisDeviceOnly
. Cela garantira que votre UUID ne migre pas vers un autre appareil. Pour accéder à votre UUID à partir d'autres applications, utilisez lakSecAttrAccessGroup
clé.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 également même si l'utilisateur migre entre les appareils (par exemple, sauvegarde complète et restauration vers un autre appareil).
En fait, cela devient un identifiant utilisateur unique en ce qui vous concerne. (encore mieux que l' identifiant de l' appareil ).
Exemple:
Je définis une méthode personnalisée pour créer un en
UUID
tant que:Vous pouvez ensuite le stocker lors
KEYCHAIN
du tout premier lancement de votre application. Pour qu'après le premier lancement, nous puissions simplement l'utiliser à partir du trousseau, pas besoin de le régénérer. La principale raison d'utiliser le trousseau pour stocker est la suivante: lorsque vous définissez leUUID
sur le trousseau, il persistera même si l'utilisateur désinstalle complètement l'application, puis l'installe à nouveau. . C'est donc le moyen permanent de le stocker, ce qui signifie que la clé sera unique tout le long.Au lancement de l'application, incluez le code suivant:
Téléchargez le fichier SSKeychain.m et .h à partir de sskeychain et faites glisser le fichier SSKeychain.m et .h vers votre projet et ajoutez "Security.framework" à votre projet. Pour utiliser UUID par la suite, utilisez simplement:
la source
Vous pouvez peut-être utiliser:
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 et exécutées sur le même appareil. Une valeur différente est renvoyée pour les applications sur le même appareil provenant de différents fournisseurs et pour les applications sur différents appareils, quel que soit le fournisseur.
la source
Vous voudrez peut-être envisager d'utiliser
OpenUDID
ce qui est un remplacement sans rendez-vous pour les obsolètesUDID
.Fondamentalement, pour correspondre à
UDID
, les fonctionnalités suivantes sont requises:OpenUDID
remplit ce qui précède et a même un mécanisme de retrait intégré pour un examen ultérieur.Vérifiez http://OpenUDID.org qu'il pointe vers le GitHub correspondant. J'espère que cela t'aides!
En guise de remarque, 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 bas est empoisonné. L'adresse MAC est très sensible, et Apple peut très bien déprécier l'accès à celle-ci avant que vous ne puissiez même dire "SOUMETTRE CETTE APP" ... l'adresse réseau MAC est utilisée pour authentifier certains appareils sur des réseaux privés (WLAN) ou d'autres réseaux privés virtuels réseaux (VPN). .. il est encore plus sensible que l'ancien UDID!
la source
Je suis sûr qu'Apple a agacé beaucoup de gens avec ce changement. Je développe une application de comptabilité pour iOS et j'ai 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 appareils et des modifications qui doivent leur être propagées. Il est donc important de savoir quels appareils sont lesquels. Je garde la trace des appareils utilisant l'UIDevice uniqueIdentifier et pour ce qu'il vaut, voici mes réflexions.
Générer un UUID et stocker dans les valeurs par défaut des utilisateurs? Pas bon car cela ne persiste pas lorsque l'utilisateur supprime l'application. S'ils réinstallent plus tard, le service en ligne ne doit 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 deux fois ou plus. Les utilisateurs verraient plus d'un "iPhone de Bob" répertoriés 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 appareils contenant le même ID d'appareil si les anciens et les nouveaux appareils sont tous deux en service. Ceux-ci doivent être répertoriés comme deux appareils dans le service en ligne, même si le nom de l'appareil est le même.
Générer un hachage l'adresse MAC et l'ID de bundle? Cela ressemble à la meilleure solution pour ce dont j'ai besoin. En hachant avec l'ID de l'ensemble, l'ID d'appareil généré ne permettra pas de suivre l'appareil sur les applications et j'obtiens un ID unique pour la combinaison app + appareil.
Il est intéressant de noter que la propre documentation d'Apple fait référence à la validation des reçus du Mac App Store en calculant un hachage de l'adresse MAC du système plus l'ID et la version du bundle. Donc, cela semble permis par la politique, que cela passe par l'examen des applications, je ne sais pas encore.
la source
kSecAttrAccessibleAlwaysThisDeviceOnly
. Cela garantira que votre UUID ne sera pas restauré sur d'autres appareils, même si la sauvegarde est cryptée.Il ressemble à iOS 6, Apple vous recommande d'utiliser la classe NSUUID .
Du message maintenant dans les documents UIDevice pour la
uniqueIdentifier
propriété:la source
Peut aider: utilisez le code ci-dessous, il sera toujours unique sauf que vous effacez (formatez) votre appareil.
la source
Je voudrais aussi vous suggérons de changer au- dessus de
uniqueIdentifier
la cette bibliothèque open source (2 catégories simples vraiment) qui utilisent l'adresse MAC de l'appareil avec le Bundle App Identifier pour générer un identifiant unique dans vos applications qui peuvent être utilisées en remplacement UDID.Gardez à l'esprit que contrairement à l'UDID, ce nombre sera différent pour chaque application.
Vous avez simplement besoin d'importer les inclus
NSString
et lesUIDevice
catégories et appel[[UIDevice currentDevice] uniqueDeviceIdentifier]
comme ceci:Vous pouvez le trouver sur Github ici:
UIDevice avec UniqueIdentifier pour iOS 5
Voici les catégories (juste les fichiers .m - vérifiez le projet github pour les en-têtes):
la source
Vous pouvez réaliser à partir de ce code: UIDevice-with-UniqueIdentifier-for-iOS-5
la source
L'adresse MAC peut être usurpée, ce qui rend une telle approche inutile pour lier du contenu à des utilisateurs spécifiques ou pour implémenter des fonctionnalités de sécurité telles que des listes noires.
Après quelques recherches supplémentaires, il me semble que nous nous retrouvons sans alternative appropriée à partir de maintenant. J'espère sérieusement qu'Apple reconsidérera sa décision.
Ce serait peut-être une bonne idée d'envoyer un e-mail à Apple à ce sujet et / ou de déposer une demande de bug / fonctionnalité à ce sujet, car ils ne sont peut-être même pas conscients des conséquences complètes pour les développeurs.
la source
UIDevice identifierForVendor
introduit dans iOS 6 fonctionnerait pour vos besoins.identifierForVendor
est une chaîne alphanumérique qui identifie de manière unique un appareil auprès du fournisseur de l'application. (lecture seulement)La valeur de cette propriété est la même pour les applications provenant du même fournisseur et exécutées sur le même appareil. Une valeur différente est renvoyée pour les applications sur le même appareil qui proviennent de différents fournisseurs, et pour les applications sur différents appareils, selon le fournisseur.
Disponible dans iOS 6.0 et versions ultérieures et déclaré dans
UIDevice.h
Pour iOS 5, reportez-vous à ce lien UIDevice-with-UniqueIdentifier-for-iOS-5
la source
Utilisation du SSKeychain et du code mentionnés ci-dessus. Voici le code à copier / coller (ajoutez le module SSKeychain):
}
la source
Le code suivant aide à obtenir l'UDID:
la source
Voici le code que j'utilise pour obtenir l'ID pour iOS 5 et iOS 6, 7:
la source
PerformSelector may cause a leak because its selector is unknown
?À partir d'iOS 6, nous avons une
NSUUID
classe conforme à RFC4122Lien Apple: apple_ref pour NSUUID
la source
iOS 11 a introduit le framework DeviceCheck. Il a une solution complète pour identifier de manière unique l'appareil.
la source
Une façon pratique d'obtenir l'UDID:
Un exemple utilisant RoutingHTTPServer :
Voici le contenu de
udid.mobileconfig
:L'installation du profil échouera (je n'ai pas pris la peine d'implémenter une réponse attendue, voir la documentation ), mais l'application obtiendra un UDID correct. Et vous devez également signer le mobileconfig .
la source
Pour Swift 3.0, veuillez utiliser le code ci-dessous.
la source
Vous pouvez utiliser
Ce qui est unique pour l'appareil dans toutes les applications.
la source
Apple a ajouté un nouveau cadre dans iOS 11 appelé DeviceCheck qui vous aidera à obtenir l'identifiant unique très facilement. Lisez ce formulaire plus d'informations. https://medium.com/@santoshbotre01/unique-identifier-for-the-ios-devices-590bb778290d
la source
Si quelqu'un tombe sur cette question, lors de la recherche d'une alternative. J'ai suivi cette approche en
IDManager
classe, c'est une collection de différentes solutions. KeyChainUtil est un wrapper pour lire à partir du trousseau. Vous pouvez également utiliser lehashed MAC address
comme une sorte d'ID unique.la source
la source
Nous pouvons utiliser identifierForVendor pour ios7,
--Note importante ---
UDID et identifierForVendor sont différents: ---
la source
Apple a masqué l'UDID de toutes les API publiques, à commencer par iOS 7. Tout UDID commençant par FFFF est un faux ID. Les applications "Envoyer UDID" qui fonctionnaient auparavant ne peuvent plus être utilisées pour collecter l'UDID pour les appareils de test. (soupir!)
L'UDID s'affiche lorsqu'un appareil est connecté à XCode (dans l'organiseur) et lorsque l'appareil est connecté à iTunes (bien que vous deviez cliquer sur `` Numéro de série '' pour que l'identifiant s'affiche.
Si vous devez obtenir l'UDID d'un appareil à ajouter à un profil d'approvisionnement, et que vous ne pouvez pas le faire vous-même dans XCode, vous devrez les suivre à travers les étapes pour le copier / coller à partir d'iTunes.
Existe-t-il un moyen depuis (sortie d'iOS 7) d'obtenir l'UDID sans utiliser iTunes sur un PC / Mac?
la source
J'avais aussi un problème et la solution est simple:
la source
Une alternative non parfaite mais l'une des meilleures et des plus proches de l'UDID (dans Swift utilisant iOS 8.1 et Xcode 6.1):
Génération d'un UUID aléatoire
Et utilisez la bibliothèque KeychainWrapper :
Ajoutez une valeur de chaîne au trousseau:
Récupérez une valeur de chaîne à partir du trousseau:
Supprimez une valeur de chaîne du trousseau:
Cette solution utilise le trousseau, donc l'enregistrement stocké dans le trousseau sera conservé, même après la désinstallation et la réinstallation de l'application. La seule façon de supprimer cet enregistrement est de réinitialiser tous les contenus et paramètres de l'appareil. C'est pourquoi j'ai mentionné que cette solution de substitution n'est pas parfaite mais reste l'une des meilleures solutions de remplacement pour UDID sur iOS 8.1 à l'aide de Swift.
la source
NSLog (@ "% @", [[UIDevice currentDevice] identifierForVendor]);
la source