J'ai implémenté cette méthode pour obtenir advertisingIdentifier
et identifierForVendor
:
- (NSString *) advertisingIdentifier
{
if (!NSClassFromString(@"ASIdentifierManager")) {
return [OpenUDID value];
}
return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}
- (NSString *) identifierForVendor
{
if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) {
return [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
return @"";
}
- (BOOL)isAdvertisingTrackingEnabled
{
if (NSClassFromString(@"ASIdentifierManager") && ![[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
return NO;
}
return YES;
}
Sur le simulateur, tout fonctionne comme il se doit et je peux obtenir la représentation des 2 chaînes de caractères.
Mais lorsque je lance à partir d'iPhone 3GS avec iOS 6.0 (10A403), ces 2 méthodes renvoient "00000000-0000-0000-0000-000000000000" comme identifiant. Déjà fait:
Cela semble être un bug dans iOS. Voir le même problème sur les appareils mis à niveau sans fil, mais les appareils mis à niveau avec Xcode ou iTunes fonctionnent normalement sans zéros.
J'ai essayé de suivre les mêmes étapes que vous et le seul thème commun était celui de l'over-the-air (mauvais) par rapport à la mise à niveau en mode attaché (bon).
Mise à jour: Les utilisateurs qui passent directement d'iOS 5.1 à 6.1 par voie hertzienne éprouvent un comportement différent. Chaque fois que l'application est complètement fermée et redémarrée, une nouvelle valeur est renvoyée par identifierForVendor
. On pourrait s'y attendre si l'application était en cours de désinstallation et de réinstallation, mais ce n'est pas le cas.
Apple a confirmé ce bogue dans son système en réponse à une demande d'incident du support technique. Ils ont dit que identifierForVendor
et advertisingIdentifier
parfois Renvoyer tous les zéros peuvent être vus à la fois dans les versions de développement et les applications téléchargées à distance de l'App Store. Ils n'ont pas de travail et ne savent pas quand le problème sera résolu.
Dans certaines situations, l’API renvoie une réponse vide pour l’ID, comme après la restauration du périphérique.
Nous vous suggérons de différer la récupération de votre identifiant afin que vous puissiez appeler quelque chose comme ceci:
-(void)retrieveID
{
if (<check fails>)
[self performSelector:@"retrieveID" withObject:nil afterDelay:1.0];
}
Et chercher l'ID plus tard.