Что использовать, если не "IPhone UDID"?

Ух ты... посмотри на все "панические истории" на этой неделе, касающиеся использования UDID в iPhone.

 [[UIDevice currentDevice] uniqueIdentifier]

Что мы должны использовать вместо этого?

Что, если телефон продан другому пользователю... и приложение сохранило некоторые данные на удаленном сервере, основываясь на UDID телефона?

(Конечно, я хочу избежать проблем с "ограничениями шифрования" в магазине приложений.)

7 ответов

Почему бы не использовать Mac-адрес и, возможно, затем его хешировать.

Здесь есть отличная категория UIDevice-Extension.

    - (NSString *) macaddress
{
    int                 mib[6];
    size_t              len;
    char                *buf;
    unsigned char       *ptr;
    struct if_msghdr    *ifm;
    struct sockaddr_dl  *sdl;

    mib[0] = CTL_NET;
    mib[1] = AF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_LINK;
    mib[4] = NET_RT_IFLIST;

    if ((mib[5] = if_nametoindex("en0")) == 0) {
        printf("Error: if_nametoindex error\n");
        return NULL;
    }

    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 1\n");
        return NULL;
    }

    if ((buf = malloc(len)) == NULL) {
        printf("Could not allocate memory. error!\n");
        return NULL;
    }

    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 2");
        return NULL;
    }

    ifm = (struct if_msghdr *)buf;
    sdl = (struct sockaddr_dl *)(ifm + 1);
    ptr = (unsigned char *)LLADDR(sdl);
    NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", 
                           *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
    // NSString *outstring = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X", 
    //                       *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
    free(buf);

    return outstring;
}

Вы могли бы хэшировать это с моделью?

Как я спросил сегодня утром в этом посте, есть несколько альтернатив:

1- во-первых, как рекомендует Apple, идентифицируйте для каждой установки вместо идентификации для каждого устройства. Поэтому вы можете использовать CFUUIDRef. Пример:

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

2- Если вам нужен всемирный уникальный идентификатор, вы можете сохранить этот идентификатор в iCloud.

3. Наконец, если вам действительно нужен идентификатор, который остается после переустановки приложения (что происходит не так часто), вы можете использовать цепочки для ключей (документ от Apple по связке ключей). Но понравится ли это яблочной команде?

Как это:

@interface UIDevice (UIDeviceAppIdentifier)
@property (readonly) NSString *deviceApplicationIdentifier;
@end

@implementation UIDevice (UIDeviceAppIdentifier)
- (NSString *) deviceApplicationIdentifier
{ 
  static NSString     *name    = @"theDeviceApplicationIdentifier";
  NSUserDefaults  *defaults = [NSUserDefaults standardUserDefaults];  
  NSString              *value     = [defaults objectForKey: name];

  if (!value)
    {
      value = (NSString *) CFUUIDCreateString (NULL, CFUUIDCreate(NULL));    
      [defaults setObject: value forKey: name];
      [defaults synchronize];
  }
  return value;
}
@end

документация iOS более или менее описывает использование CFUUIDCreate() для создания идентификатора и предлагает использовать UserDefaults для его хранения.

UUID просто амортизируется и так будет некоторое время, Apple пока мало что говорит об этой амортизации, я бы подождал, когда они еще что-нибудь скажут по этому поводу и, возможно, предложат какую-то альтернативу.

Одним из решений было бы заставить приложение выпустить бесплатную покупку в приложении.

Эта покупка будет:

  1. Отслеживается, с уникальным номером (покупки), который будет иметь значение только для вашего приложения.

  2. Подвижный, если человек переключает устройства

  3. Доступно для извлечения, если приложение удалено (или телефон стерт и перезагружен) - покупки в приложении можно восстановить.

Рекомендуемый способ - использовать генерацию UUID и связывать это с тем, что пользователь сам хочет предоставить приложению.

Затем сохраните эти данные извне, где они могут быть восстановлены снова. Возможно, есть другие способы сделать это легко, но это рекомендуемый способ.

Документация Apple гласит:

"Не используйте свойство uniqueIdentifier. Чтобы создать уникальный идентификатор, специфичный для вашего приложения, вы можете вызвать функцию CFUUIDCreate, чтобы создать UUID, и записать его в базу данных по умолчанию с помощью класса NSUserDefaults".

Вот быстрый фрагмент:

CFUUIDRef udid = CFUUIDCreate(NULL);

NSString *udidString = (NSString *) CFUUIDCreateString(NULL, udid);
Другие вопросы по тегам