Что использовать, если не «IPhone UDID»? - PullRequest
9 голосов
/ 05 октября 2010

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

 [[UIDevice currentDevice] uniqueIdentifier]

Что СЛЕДУЕТ использовать вместо этого?

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

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

Ответы [ 7 ]

3 голосов
/ 20 августа 2011

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

Существует превосходная категория расширения UIDevice здесь

    - (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;
}

Возможно, вы можете хэшироватьэто с моделью?

2 голосов
/ 09 марта 2012

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

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 ).Но понравится ли это яблочной команде?

1 голос
/ 06 апреля 2012

Например:

@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 для его хранения.

1 голос
/ 20 августа 2011

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

0 голосов
/ 20 декабря 2011

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

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

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

CFUUIDRef udid = CFUUIDCreate(NULL);

NSString *udidString = (NSString *) CFUUIDCreateString(NULL, udid);
0 голосов
/ 12 октября 2011

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

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

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

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

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

0 голосов
/ 20 августа 2011

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

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

...