Question

Pour une application iPhone qui soumet des images à un serveur, je dois en quelque sorte lier toutes les images d'un téléphone particulier. Avec chaque soumission, j'aimerais envoyer un identifiant de téléphone unique. Regardé

  [[UIDevice mainDevice] uniqueIdentifier]
and [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]

mais en recevant des erreurs dans le simulateur.

Existe-t-il un moyen sanctionné par Apple de le faire?

Était-ce utile?

La solution

Quelles erreurs obtenez-vous? [[UIDevice currentDevice] uniqueIdentifier] ( modifié pour corriger l'API, merci Martin! ) est le moyen officiellement recommandé de procéder.

Autres conseils

Vous pouvez également utiliser CFUUID pour générer un UUID. Voici du code:

NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
  uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
  [uuid autorelease];
  CFRelease(theUUID);
}

De loin, le moyen le plus simple et le plus approprié d’obtenir un identifiant unique est d’utiliser les mécanismes fournis explicitement par Apple pour en obtenir un - [[UIDevice currentDevice] uniqueIdentifier] . Vous ne pouvez pas garantir que le numéro de téléphone sera unique à l'appareil ou que celui-ci aura même un numéro de téléphone. Au-delà de cela, cela est une idée horrible car il s'agit d'une invasion définitive de la vie privée de l'utilisateur. Même le uniqueidentifier doit être haché si vous voulez le stocker de quelque manière que ce soit.

Pour conserver l'identifiant unique que vous créez entre les installations, vous pouvez utiliser le trousseau Simplifié avec SSKeychain : définissez simplement votre UUID comme suit:

        [SSKeychain setPassword:@"Your UUID" forService:@"com.yourapp.yourcompany" account:@"user"];

et rappelez-le à tout moment si vous en avez besoin:

NSString *retrieveuuid = [SSKeychain passwordForService:@"com.yourapp.yourcompany" account:@"user"];

Remarque: les services et les comptes doivent correspondre exactement .

Ensuite, si l'application est supprimée et réinstallée, l'UUID persistera avec la réinstallation.

Si vous souhaitez ensuite partager cet UUID sur plusieurs appareils, configurez votre application pour utiliser iCloud. Vous pouvez ensuite stocker l’UUID dans NSUserDefaults, la synchroniser avec KeyValueStore, puis définir l’UUID dans le trousseau de nouveaux périphériques avec le code ci-dessus.

Cette réponse prendrait énormément de temps si je tapais du code pour tout ce qui précède, mais il y a beaucoup d'exemples de code disponibles ici pour tout comprendre.

N'oubliez pas que dans iOS 5 uniqueIdentifier sera obsolète, vous devrez utiliser CFUUID à la place de cela

.

Fait intéressant, Apple a depuis déconseillé l’identificateur uniqueIdentifier dans iOS 5 (comme mentionné par gN0Me). Voici l'article pertinent de TechCrunch: http://techcrunch.com/2011/08/ 19 / apple-ios-5-phasing-out-udid /

Apple vous suggère de ne plus identifier le périphérique de manière unique, mais d'identifier l'utilisateur . Dans la plupart des cas, il s'agit d'un excellent conseil, même si certaines situations nécessitent encore un ID de périphérique global . Ces scénarios sont assez courants dans la publicité. Par conséquent, j’ai écrit une bibliothèque d’installation extrêmement simple qui reproduit exactement le comportement existant.

Dans une fiche de promotion personnelle sans vergogne, je vais le relier ici dans l’espoir que quelqu'un le trouve utile. De plus, tous les commentaires et critiques sont les bienvenus: http://www.binpress.com/app/myid/591

Néanmoins, dans votre cas particulier, je vous conseillerais de ne pas utiliser la fonctionnalité d'identifiant unique globalement fournie par ma bibliothèque, car elle est un peu trop lourde pour votre cas. Au lieu de cela, je générerais un CFUUID simple et le stockerais dans NSUserDefaults. Cet identifiant serait spécifique à votre application mais vous permettrait de regrouper toutes les photos correspondant à cette "installation d'installation". dans votre base de données.

En d'autres termes, en rendant obsolète la méthode uniqueIdentifier, Apple suggère de ne pas identifier par périphérique mais par application installer . Sauf si vous opérez dans des conditions spécifiques, il est probable que l'ID par application corresponde mieux à votre produit.

C’est un problème intéressant que je cherche également à résoudre. Voici un scénario que je voudrais aborder.

Que se passe-t-il lorsque vous vendez votre téléphone à une autre personne ... cet identifiant d'appareil appartiendra alors à quelqu'un d'autre, donc même si l'application est supprimée de l'iPhone, elle pourrait être rajoutée et toutes ces données seraient alors ré-associé à un nouvel utilisateur ... c'est mauvais.

Utiliser le numéro de téléphone avec l'identifiant de périphérique MD5 serait une excellente solution. Nous avons également mis au point une base de données SQL Lite avec un jeton haché avec l’ID de périphérique. Ensuite, lorsque l'application est supprimée, la base de données est supprimée et toutes les données sont dissociées. Je pense que cela pourrait être trop fragile.

Avez-vous d'autres idées?

Rob Ellis (PhoneGap / Nitobi)

Je n'ai pas terminé le travail sur l'iPhone, mais pourquoi ne pas utiliser un hachage de quelque chose d'unique au téléphone ... oh, dites le numéro de téléphone?

Obtenir le numéro d'iPhone

extrait:

NSString *phoneNumber = (NSString *) [[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"]; // Will return null in simulator!
NSLog(@"Formatted phone number [%@]", phoneNumber);

J'ai [récemment] exécuté ce code tel quel sur OS 2.2.1 [et OS 3.0].

Il fonctionne comme prévu lorsqu'il est exécuté sur le périphérique et renvoie mon numéro de téléphone avec les codes de numérotation internationaux complets [1 dans mon cas].

Lorsqu'elle est exécutée sur le simulateur, la valeur [renvoyée] est une chaîne nulle et ne fonctionne donc que sur un appareil iPhone réel.

Je ne l'ai pas testé sur un iPod Touch.

...

a exécuté ce code sur un autre appareil cette semaine et a obtenu une valeur nulle au lieu du nombre.

Lors de recherches ultérieures, il apparaît que le numéro renvoyé par cet extrait de code est le numéro défini dans iTunes pour le périphérique.

Si vous n'avez pas entré le numéro de l'iPhone dans iTunes lors de l'activation de l'appareil, ou peut-être (comme dans mon cas) si la valeur par défaut n'était pas le numéro de l'iPhone et que vous avez quand même cliqué sur OK, de sorte qu'iTunes ne répertorie pas numéro de téléphone lorsque votre iPhone est branché, ce code renverra une chaîne nulle.

[Ci-dessus est une concaténation modifiée de commentaires que j'ai récemment publiés dans un autre article sur ce sujet à l'adresse http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/]

Voici plus d'informations sur un pour l’obtenir sur iTunes, ce qui peut être utile à des fins de test.

J'ai eu du succès avec ce code:

- (NSString *)stringUniqueID {
    NSString *  result;
    CFUUIDRef   uuid;
    CFStringRef uuidStr;
    uuid = CFUUIDCreate(NULL);
    assert(uuid != NULL);
    uuidStr = CFUUIDCreateString(NULL, uuid);
    assert(uuidStr != NULL);
    result = [NSString stringWithFormat:@"%@", uuidStr];
    assert(result != nil);
    NSLog(@"UNIQUE ID %@", result);
    CFRelease(uuidStr);
    CFRelease(uuid);
    return result;
}    

Vous pouvez utiliser l'adresse MAC comme identifiant unique. Le lien suivant vous aidera

Comment obtenir le MAC par programme adresse d'un iphone

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top