Идентификатор рекламы и идентификаторForVendor возвращают "00000000-0000-0000-0000-000000000000",

Я реализовал эти методы, чтобы получить advertisingIdentifier и 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;
}

На симуляторе все работает так, как должно быть, и я могу получить представление двух строк.

Но, когда я запускаю iPhone 3GS с iOS 6.0 (10A403), эти 2 метода возвращают "00000000-0000-0000-0000-000000000000" в качестве идентификатора. Уже сделано:

  • Перезагрузили устройство
  • Удалено приложение и переустановлено
  • Создан и установлен Ad-Hoc, установлен, удален и установлен снова
  • Запустите этот код из другого приложения
  • Протестировано на iPad 2 с iOS 6.0 (10A403), и все прошло ok (у меня есть правильные идентификаторы)

Ответ 1

Кажется, это ошибка в iOS. Увидев ту же проблему на устройствах, которые были обновлены по воздуху, но устройства, обновленные с помощью Xcode или iTunes, работают как ожидалось без нулей.

Пробовал подобные шаги, как и вы, и единственная распространенная тема была по-эфиру (плохо) и привязана к обновлению (хорошая).

Обновление: Пользователи, которые перемещаются напрямую с iOS 5.1 до 6.1, испытывают другое поведение. Каждый раз, когда приложение полностью закрывается и перезапускается, новое значение возвращается identifierForVendor. Это можно было бы ожидать, если приложение будет удалено и переустановлено, но это не так.

Ответ 2

Apple подтвердила эту ошибку в своей системе в ответ на запрос службы технической поддержки. Они сказали, что identifierForVendor и advertisingIdentifier иногда возвращение всех нулей можно увидеть как в сборках разработки, так и в приложениях, загружаемых в эфир из App Store. Они не работают и не могут сказать, когда проблема будет исправлена.

Ответ 3

Есть несколько ситуаций, когда API возвращает пустой ответ для ID, например, после восстановления устройства.

Предложение состоит в том, чтобы отложить повтор ID, так что вы можете вызвать sometginh следующим образом:

-(void)retrieveID
{
    if (<check fails>)
        [self performSelector:@"retrieveID" withObject:nil afterDelay:1.0];
}

И введите идентификатор позже.