2010-10-05 13 views
8

Wow ... spójrz na wszystkie "historie paniki" w tym tygodniu dotyczące używania UDID iPhone'a.Co używać, jeśli nie "IPHONE UDID"?

[[UIDevice currentDevice] uniqueIdentifier] 

Co POWINIEN możemy używać zamiast tego?

Co się stanie, jeśli telefon zostanie sprzedany innemu użytkownikowi ... a aplikacja zapisała niektóre dane na zdalnym serwerze na podstawie identyfikatora UDID telefonu?

(Oczywiście, chcę, aby uniknąć problemów z „ograniczeniami szyfrowania” App Store).

+2

Nie wiem, jakie są historie w tym tygodniu. I powinieneś zmienić to w konkretne pytanie. Do czego zamierzałeś użyć UDID? Na pewno nie zastąpienie pełnego poświadczenia użytkownika? – marcc

+0

co próbujesz zrobić? Używam solonej wersji UDID do znanej z danych urządzenia zsynchronizowanych z innym urządzeniem. Myślę, że to w porządku. Nie zgłaszam niczego do mojego serwera, aby zobaczyć, co ludzie robią z mojej aplikacji. Złą rzeczą nie jest użycie udid, złe są te "szpiegowskie" funkcje. Wszystko, co ci faceci robią whit UDIDs można osiągnąć w inny sposób. –

+0

Identyfikator UDID służy do "identyfikacji unikalnego urządzenia lub użytkownika" ... do "zapisania i odzyskania danych" ... i jestem pewien, że niektóre z nich to BARDZO prywatne informacje. Co należy zamiast tego użyć? Coś, czego użytkownik nie może udawać, że jest innym użytkownikiem. Wszystko bez sprawdzania adresów e-mail lub nazwy użytkownika lub haseł. – Patty

Odpowiedz

0

Zalecanym sposobem jest użycie UUID generacji i kojarzy, że coś, że mu user/sama jest gotowi dostarczyć do aplikacji.

Następnie przechowuj te dane na zewnątrz, gdzie można je odzyskać ponownie. Prawdopodobnie są na to inne sposoby, ale jest to zalecany sposób.

+0

Problem polega na tym, że nie będzie on trwały podczas ponownej instalacji tej samej aplikacji na tym samym urządzeniu. Taki był cel UUID urządzeń. – gcamp

+0

Powiąż go z podanym ID użytkownika. Czy to nie jest celem identyfikacji? Powinien być oparty na zgodzie użytkownika. Jeśli jest on obsługiwany za pomocą adresu MAC i innej jego kombinacji, to tak naprawdę nie różni się od używania identyfikatora UDID. Jeśli zablokują UDID z powodu pewnych obaw związanych z bezpieczeństwem/prywatnością, zniechęcą również inne rodzaje identyfikacji sprzętu. –

3

Dlaczego nie używać adresu MAC i ewentualnie nie mieszać go.

Jest doskonały UIDevice-Extension Kategoria 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; 
} 

Można ewentualnie hash z tego modelu?

+0

Może nie rozumiem pytania lub odpowiedzi, ale wydaje się, że jest to * przeciwieństwo * tego, co jest pożądane - co jest identyfikatorem, który może reprezentować innego użytkownika, który nie jest * związany z tym urządzeniem (a zatem sprzedany razem z telefonem, nawet po wyczyszczeniu itp.). – Nicole

+0

Poprosił o coś, co zastąpi UDID, który był związany z urządzeniem! –

+0

Nie widzę tego w pytaniu nigdzie. To, co widzę, to pytanie o unikatowy identyfikator, a następnie oświadczenie, które interpretuję jako mówiące, że OP * nie * wymaga, aby identyfikator był przenoszony podczas sprzedaży telefonu. – Nicole

1

UUID jest po prostu amortyzowany i tak będzie przez jakiś czas, Apple jeszcze nie powiedział wiele o tej amortyzacji, czekam, aż będą mieli więcej do powiedzenia na ten temat, a może zaoferują coś innego.

0

Jednym z rozwiązań może być bezpłatna zakup aplikacji w aplikacji.

ten zakup będzie:

  1. śledzenia, z unikalnym numerem (zakup) liczby, które byłyby znaczące tylko do swojej aplikacji.

  2. ruchomy, jeżeli osoba przełącza urządzeń

  3. odzysku, jeśli aplikacja zostanie usunięta (lub telefon jest wycierane i Reloaded) - zakupów w ramach aplikacji mogą zostać przywrócone.

0

dokumentacji Apple mówi:

„Nie używaj właściwość uniqueidentifier Aby stworzyć niepowtarzalny identyfikator specyficzny dla aplikacji, można wywołać funkcję CFUUIDCreate stworzyć UUID i pisać. do domyślnej bazy danych przy użyciu klasy NSUserDefaults przy użyciu ."

Oto krótki fragment:

CFUUIDRef udid = CFUUIDCreate(NULL); 

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

Niestety zwrócony identyfikator UUID nie jest spójny w różnych instalacjach aplikacji. (usuń aplikację, zainstaluj ponownie, a otrzymasz zupełnie inny identyfikator UUID). – lorean

+0

Zobacz poniższą odpowiedź, która używa UserDefaults do przechowywania UUID podczas tworzenia. – GoZoner

2

Jak poprosiłem rano w this post, istnieją pewne alternatywy:

1- pierwsze, jak odradza Apple, zidentyfikować za zainstalować zamiast pozwalający na identyfikację . na urządzenie Dlatego można użyć CFUUIDRef Przykład.

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

2- Jeśli zależy Ci na unikalnym identyfikatorze na całym świecie, możesz zapisać ten identyfikator w usłudze iCloud.

3- Nareszcie, jeśli naprawdę potrzebujesz identyfikatora, który pozostaje po ponownej instalacji aplikacji (co nie zdarza się tak często), możesz użyć pęku kluczy (Apple's keychain doc). Ale czy zespół jabłkowy się spodoba?

+1

FYI Prosta kopia tego kodu nie działa podczas używania ARC – djskinner

+0

Zobacz tutaj dla ARC: http://stackoverflow.com/questions/8594721/nsmakecollectable-and-arc-doesnt-work – djskinner

1

Jak to:

@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 

dokumentacja iOS mniej więcej opisuje wykorzystanie CFUUIDCreate(), aby utworzyć identyfikator i sugeruje użycie UserDefaults aby go zapisać.

Powiązane problemy