2010-10-05 6 views
8

Ничего себе ... посмотрите на все «истории паники» онлайн на этой неделе относительно использования UDID для iPhone.Что можно использовать, если нет "IPHONE UDID"?

[[UIDevice currentDevice] uniqueIdentifier] 

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

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

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

+2

Я не знаю, что такое истории на этой неделе. И вы должны превратить это в конкретный вопрос. На что вы планируете использовать UDID? Наверняка не полная учетная запись пользователя? – marcc

+0

Что вы пытаетесь сделать? Я использую salted md5ed версию UDID, чтобы узнать, какие данные устройства были синхронизированы с другим устройством. Я думаю, что все в порядке. Я не сообщаю ничего о своем сервере, чтобы узнать, что делают люди с моим приложением. Плохая вещь - это не использование удид, а плохие - это «шпионские» функции. Все, что делают эти парни, делают UDID, можно достичь по-другому. –

+0

UDID используется для «идентификации уникального устройства или пользователя» ... для «сохранения и восстановления данных» ... и я уверен, что некоторые из них являются ОЧЕНЬ личной информацией. Что следует использовать вместо этого? Что-то пользователь не может претендовать на роль другого пользователя. Все без проверки адресов электронной почты или имени пользователя или паролей. – Patty

ответ

0

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

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

+0

Проблема заключается в том, что она не будет постоянной для переустановки одного и того же приложения на одном устройстве. Это была цель UUID устройства. – gcamp

+0

Свяжите его с данным идентификатором пользователя. Разве это не цель идентификации? Он должен основываться на согласии пользователя. Если он работает с использованием MAC-адреса и некоторой другой комбинации, то это действительно не отличается от использования UDID. Если они откажут UDID из-за некоторой озабоченности в отношении безопасности/конфиденциальности, они также будут препятствовать другим типам идентификации оборудования. –

3

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

Существует отличный UIDevice-Extension Категория here

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

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

+0

Возможно, я не понимаю вопрос или ваш ответ, но это похоже на * противоположность * желаемого - это идентификатор, который может представлять другого пользователя, который * не привязан к этому устройству (и, следовательно, продал наряду с телефоном, даже если вытереть и т. д.). – Nicole

+0

Он попросил что-то заменить UDID, который был привязан к устройству! –

+0

Я не вижу этого в вопросе где угодно. Я вижу вопрос об уникальном идентификаторе, а затем заявление, которое я интерпретирую, говоря, что OP * не хочет, чтобы ID был передан при продаже телефона. – Nicole

1

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

0

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

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

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

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

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

0

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

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

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

CFUUIDRef udid = CFUUIDCreate(NULL); 

NSString *udidString = (NSString *) CFUUIDCreateString(NULL, udid); 
+0

К сожалению, возвращаемый UUID не соответствует настройкам приложения. (т. е. удалить приложение, переустановить, и вы получите совершенно другой UUID). – lorean

+0

См. мой ответ ниже, который использует UserDefaults для хранения UUID при создании. – GoZoner

2

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

1- первые, так как Apple, recommands, определить за установку вместо отождествления . на устройстве Таким образом, вы можете использовать CFUUIDRef. Пример:

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

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

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

+1

FYI Прямая копия этого кода не работает при использовании ARC – djskinner

+0

См. Здесь для ARC: http://stackoverflow.com/questions/8594721/nsmakecollectable-and-arc-doesnt-work – djskinner

1

Как это:

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

Смежные вопросы