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

Вау… посмотрите на все «панические истории» в Интернете на этой неделе по поводу использования UDID iPhone.

 [[UIDevice currentDevice] uniqueIdentifier]

Что ДОЛЖНО использовать вместо этого?

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

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


person Patty    schedule 05.10.2010    source источник
comment
Я не знаю, какие истории будут на этой неделе. И вы должны превратить это в конкретный вопрос. Для чего вы планировали использовать UDID? Конечно, это не полная замена учетных данных пользователя?   -  person marcc    schedule 05.10.2010
comment
Что ты пытаешься сделать? Я использую соленую версию UDID md5ed, чтобы узнать, с какого устройства данные были синхронизированы с другим устройством. Я думаю, это нормально. Я ничего не сообщаю своему серверу, чтобы узнать, что люди делают с моим приложением. Плохо не использование udid, плохо эти шпионские функции. Все, что эти ребята делают с UDID, может быть достигнуто другим способом.   -  person Matthias Bauch    schedule 05.10.2010
comment
UDID используется для идентификации уникального устройства или пользователя... для сохранения и извлечения данных... и я уверен, что некоторые из них являются ОЧЕНЬ конфиденциальной информацией. Что следует использовать вместо этого? Что-то, где пользователь не может притворяться другим пользователем. Все без проверки адресов электронной почты или имени пользователя или паролей.   -  person Patty    schedule 05.10.2010
comment
У вас не было большой проблемы с шифрованием md5 (или любым другим) при отправке приложения в магазин?   -  person Patty    schedule 05.10.2010
comment
Каковы некоторые из тех, которые были сделаны по-другому? (Не имея дело с кучей документов Apple по использованию шифрования.)   -  person Patty    schedule 05.10.2010
comment
Я использовал MD5 или соленый MD5 в 3 разных приложениях, и с Apple проблем не было. Я думаю, что их страх перед использованием шифрования стоит упомянуть только в том случае, если вы шифруете все свои данные.   -  person AlexVogel    schedule 05.10.2010
comment
Кстати, MD5 не является алгоритмом шифрования. Это алгоритм хеширования, они разные.   -  person Stefan H    schedule 12.01.2011
comment
Ограничение шифрования — это не идея Apple — они, вероятно, предпочли бы не беспокоиться. Законодательство США запрещает компаниям экспортировать продукты, содержащие определенные виды шифрования. Поскольку App Store фактически экспортирует программное обеспечение из США в остальной мир, вопрос о шифровании неизбежен.   -  person Caleb    schedule 20.08.2011
comment
Вы вообще не должны были использовать UDID ни для чего. Я не понимаю, почему Apple вообще сделала его доступным для разработчиков.   -  person Sven    schedule 20.08.2011
comment
Есть несколько хороших ответов. Я рекомендую вам принять один!   -  person djskinner    schedule 13.07.2012


Ответы (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;
}

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

person Lee Armstrong    schedule 20.08.2011
comment
Возможно, я неправильно понимаю вопрос или ваш ответ, но это кажется противоположным тому, что нужно, то есть идентификатору, который может представлять другого пользователя, который не > привязан к этому устройству (поэтому и продается вместе с телефоном даже если стерся и т.д.). - person Nicole; 20.07.2012
comment
Он действительно просил что-то, чтобы заменить UDID, который был привязан к устройству! - person Lee Armstrong; 20.07.2012
comment
Я не вижу этого в вопросе нигде. Я вижу вопрос об уникальном идентификаторе, а затем утверждение, которое я интерпретирую как говорящее, что ОП не хочет передавать идентификатор при продаже телефона. - person Nicole; 20.07.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 по связке ключей). Но понравится ли это команде Apple?

person Martin    schedule 09.03.2012
comment
См. здесь ARC: stackoverflow.com/questions/8594721/ - person djskinner; 15.08.2012

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

person Nathan Day    schedule 20.08.2011

Нравится:

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

person GoZoner    schedule 05.04.2012

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

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

person Jesse Armand    schedule 20.08.2011
comment
Проблема в том, что он не будет сохраняться при повторной установке того же приложения на том же устройстве. Это было целью UUID устройств. - person gcamp; 20.08.2011
comment
Свяжите его с данным идентификатором пользователя. Разве это не цель идентификации? Это должно быть основано на согласии пользователя. Если это обойти с помощью MAC-адреса и какой-либо другой его комбинации, то это действительно ничем не отличается от использования UDID. Если они запретят UDID из соображений безопасности/конфиденциальности, то они также будут препятствовать другим типам аппаратной идентификации. - person Jesse Armand; 20.08.2011

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

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

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

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

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

person Brad    schedule 12.10.2011

В документации Apple говорится:

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

Вот краткий фрагмент:

CFUUIDRef udid = CFUUIDCreate(NULL);

NSString *udidString = (NSString *) CFUUIDCreateString(NULL, udid);
person Alex Zak    schedule 19.12.2011
comment
К сожалению, возвращенный UUID не соответствует установкам приложения. (т.е. удалите приложение, переустановите, и вы получите совершенно другой UUID) - person lorean; 20.12.2011
comment
См. мой ответ ниже, который использует UserDefaults для хранения UUID при создании. - person GoZoner; 06.04.2012