2012-02-22 7 views
8

Używam [[UIDevice currentDevice] uniqueIdentifier] we wszystkich moich aplikacjach, Apple nie zezwala już na używanie uniqueIdentifier. Potrzebuję czegoś, co zastąpi uniqueIdentifier, za pomocą którego mogę rozpoznać użytkownika nawet wtedy, gdy użytkownik usunie aplikację i zainstaluje ją ponownie (a także otrzyma moją aplikację zatwierdzoną przez Apple).Metoda [[UIDevice currentDevice] uniqueIdentifier] jest niedozwolona, ​​potrzebuję alternatywy

Dzięki

+3

Możliwa powielane - [UIDevice uniqueidentifier Nieaktualne - Co teraz zrobić] (http://stackoverflow.com/q/6993325/194544) – beryllium

Odpowiedz

12

documentation zaleca, co zrobić w tej sekcji.

Rozważania specjalne
Nie używaj własności uniqueidentifier. Aby utworzyć unikalny identyfikator specyficzny dla aplikacji, można wywołać funkcję CFUUIDCreate, aby utworzyć identyfikator UUID, i zapisać go w bazie danych wartości domyślnych przy użyciu klasy NSUserDefaults.

Aby upewnić się, że niepowtarzalny identyfikator pozostaje po usunięciu aplikacji należy przechowywać go w keychain zamiast NSUserDefaults. Za pomocą pęku kluczy możesz także udostępniać ten sam unikatowy identyfikator we wszystkich aplikacjach na tym samym urządzeniu, używając keychain access groups. Takie podejście uniemożliwi Ci niepoprawne śledzenie użytkowników po tym, jak urządzenie przestanie być ich własnością, i będzie dostępne na każdym nowym urządzeniu, które przywróci z kopii zapasowej.

+0

znaczy mogę dodać do urządzenie pęka na UUID i usuwa aplikację, a kiedy ją ponownie zainstaluję, odzyskaję wartość i używam jej ponownie? – user784625

+0

Tak, elementy pęku kluczy pozostają trwałe (o ile urządzenie nie jest czyszczone i konfigurowane jako nowe urządzenie), a podczas korzystania z grup dostępu można zezwolić innym aplikacjom na dostęp do tej samej wartości pęku kluczy. – Joe

+0

jeszcze jedno pytanie, czy mogę używać adresu MAC i nadal otrzymywać aprobatę mojej aplikacji przez Apple? – user784625

3

Aktualizacja iOS 7 i przed:

+ (NSString *)uniqueDeviceIdentifier 
{ 
    NSString *device_id = nil; 

    if ([[self deviceModel] isEqualToString:@"Simulator iOS"]) { 
     // static id for simulator 
     device_id = @"== your random id =="; 
    } 
    else if (CurrentIOSVersion >= 6.f) { 
     // iOS 6 and later 
     device_id = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
    } 
    else { 
     // iOS 5 and prior 
     SEL udidSelector = NSSelectorFromString(@"uniqueIdentifier"); 
     if ([[UIDevice currentDevice] respondsToSelector:udidSelector]) { 
      device_id = [[UIDevice currentDevice] performSelector:udidSelector]; 
     } 
    } 
    NSLog(@">>>>>> device_id: %@", device_id); 
    return device_id; 
} 

Model urządzenia można odbierać poprzez:

+ (NSString*)deviceModel 
{ 
    static NSString *device_model = nil; 

    if (device_model != nil) 
     return device_model; 

    struct utsname systemInfo; 
    uname(&systemInfo); 
    NSString *str = @(systemInfo.machine); 

    return device_model; 
} 
+0

Problem z tym kodem polega na tym, że zwróci on inną wartość za każdym razem, gdy zostanie wywołany w systemie iOS 6 lub nowszym. Aby być zamiennikiem 'uniqueIdentifier', musi być stały. – kamprath

Powiązane problemy