Подтвердить что ты не робот

Я хочу уникальную строку идентификатора, которая обнаруживает устройство iPhone (как UDID)?

Я хочу уникальную строку идентификатора для устройств iPhone вместо UDID и MAC.

1. Get UDID и MAC устарели apple.
  2. Мы можем использовать UUID, но он изменится после переустановки приложения или удаления приложения.

Я хочу любое уникальное значение устройства, которое остается таким же после того, как приложение переустановит ИЛИ удалит ИЛИ обновит версию iOS.

4b9b3361

Ответ 1

Что вы можете сделать, это получить уникальный идентификатор с помощью [[UIDevice currentDevice] identifierForVendor] или любого другого уникального генератора идентификаторов. После этого вы должны сохранить это значение в цепочке ключей с помощью KeychainItemWrapper и использовать. После сохранения значения в цепочке ключей он не будет удален даже после удаления и повторной установки приложения.

Вот руководство по доступу к keychain - Ссылка

Ответ 2

Как сказал @danypata, используйте идентификатор ForVendor, как описано в этом ответе.

Или, альтернативно, вы можете использовать рекламу NSUDID в качестве описанной здесь.

Однако они могут возвращаться как ноль или меняться со временем. Пользователь может отказаться от отслеживания рекламодателей, поэтому я не рекомендую использовать его для отслеживания пользователей в ваших собственных целях.

Я думаю, это зависит от того, почему вы отслеживаете свое устройство в первую очередь. Мое отношение состоит в том, что мне не нужно отслеживать привычки пользователей НАВСЕГДА. Мне нужно только отслеживать общие тенденции пользователей и некоторую информацию DAU. Поэтому я составляю свой собственный UDID - который будет меняться при каждой установке приложения. В моей следующей версии я буду использовать идентификатор ForVendor, и если он NIL, я составу самостоятельно.

Вот как я делаю свое:

// this makes a device id like: UUID = 89CD872F-C9AF-4518-9E6C-A01D35AF091C
// except that I'm going to attach some other attributes to it like the OS version, model type, etc.
// the UUID that is stored in user defaults will be like the one above.. but the device id that gets returned
// from this function and sent to [my online system] will have the extra info at the end of the string.
- (void) createUUID {
   // for collecting some data.. let add some info about the device to the uuid

   NSString *thisDeviceID;
   NSString *systemVersion = [[UIDevice currentDevice]systemVersion];
   NSString *model = [[UIDevice currentDevice]model];
   NSString *retinaTag;
   if (retina) {
       retinaTag = @"Retina";
   }
   else {
       retinaTag = @"";
   }
   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
   id uuid = [defaults objectForKey:@"uniqueID"];
   if (uuid)
       thisDeviceID = (NSString *)uuid;
   else {
       CFStringRef cfUuid = CFUUIDCreateString(NULL, CFUUIDCreate(NULL));
       thisDeviceID = (__bridge NSString *)cfUuid;
       CFRelease(cfUuid);
       [defaults setObject:thisDeviceID forKey:@"uniqueID"];
   }
   //NSLog(@"UUID = %@", thisDeviceID);

   MYthisDeviceID = [NSString stringWithFormat:@"%@-%@-%@-%@",thisDeviceID,systemVersion,retinaTag,model];

   //NSLog(@"UUID with info = %@", MYthisDeviceID);

}

Затем одна строка, отправляемая на мой сервер, имеет в ней как UDID, так и спецификации устройства и os. Пока пользователь полностью не удалит и не перезагрузит приложение, статистика показывает использование этого устройства. Чтобы не получить двойные udids, если они обновляются до нового os, вы можете обрезать только часть udid.

Я не использую адрес mac вообще, потому что я понял, что яблоко не хочет нас. Хотя я не могу найти документацию, которая говорит об этом на данный момент.

ОБНОВЛЕНИЕ для iOS7:

Теперь я использую этот код, который работает под io6 и io7:

NSString *globalDeviceID;

- (void) createUUID
{
    NSString *thisDeviceID;
    NSString *systemVersion = [[UIDevice currentDevice]systemVersion];
    NSString *model = [[UIDevice currentDevice]model];
    NSString *retinaTag;

    if (retina) {
        retinaTag = @"Retina";
    }
    else {
        retinaTag = @"";
    }

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    id uuid = [defaults objectForKey:@"deviceID"];
    if (uuid)
        thisDeviceID = (NSString *)uuid;
    else {        
        if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) {
            thisDeviceID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
        }
        else
        {
            CFStringRef cfUuid = CFUUIDCreateString(NULL, CFUUIDCreate(NULL));
            thisDeviceID = (__bridge NSString *)cfUuid;
            CFRelease(cfUuid);
        }
        [defaults setObject:thisDeviceID forKey:@"deviceID"];
    }
    NSLog(@"UUID = %@", thisDeviceID);
    globalDeviceID = [NSString stringWithFormat:@"%@-%@-%@-%@",thisDeviceID,systemVersion,retinaTag,model];
    NSLog(@"UUID with info = %@", globalDeviceID);
}

Ответ 3

Try

[[UIDevice currentDevice] identifierForVendor];

Это от iOS 6.

Ответ 4

Или просто используйте следующее и сохраните NSUserDefaults

[NSProcessInfo processInfo].globallyUniqueString

Глобальный идентификатор для процесса. Идентификатор включает имя хоста, идентификатор процесса и отметку времени, которая гарантирует, что идентификатор уникален для сети.

Ответ 5

Я бы предложил посмотреть OpenUDID.

Я полагаю, что под ним используется MAC-адрес, поэтому, если вы правильно говорите, что доступ к MAC-адресу устарел, то, вероятно, это будет не очень полезно, однако, я думаю, было бы неразумно Apple удалять доступ; MAC-адрес имеет другие приложения, которые просто идентифицируют устройство для целей UDID