Jak zachować identifierForVendor w ios po odinstalowaniu aplikacji ios na urządzeniu?

Rozwijam aplikację na iOS, która wywołuje usługę internetową do logowania i w tym czasie wysyłam poświadczenia logowania do serwera www wraz z identyfikatorem dostawcy (identifierForVendor), aby identyfikować urządzenie jednoznacznie dla tych credentials.So użytkownik może mieć tylko jedno urządzenie i jedno poświadczenie.

I got identifierForVendor with

NSString *uuid = [[UIDevice currentDevice] identifierForVendor].UUIDString

Ten identyfikator będzie następnie przechowywany w bazie danych serwera www, a także w bazie danych urządzenia.Następnym razem, gdy użytkownik otworzy aplikację i spróbuje pobrać dane z serwera www najpierw local identifierForVendor na urządzeniu użytkownika porównuje się z identyfikatorem przechowywanym na serwerze WWW.

Problem występuje, gdy użytkownik odinstalować aplikację i ponownie zainstalować go, znalazłem, że identifierForVendor jest zmieniony. Więc użytkownik nie może kontynuować.

I read Apple documentation UIDevice Documentation

Jak wspomniano, jeśli cała aplikacja od tego samego dostawcy odinstaluje się z urządzenia, a następnie w momencie nowej instalacji dowolnej aplikacji od tego dostawcy będzie nowy identifier forvendor.

Jak sobie z tym poradzić w moim przypadku ?
Author: Harshavardhan, 2014-02-19

8 answers

Możesz trzymać go w Pęku Kluczy

-(NSString *)getUniqueDeviceIdentifierAsString
{

 NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];

 NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"];
 if (strApplicationUUID == nil)
 {
    strApplicationUUID  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"];
 }

 return strApplicationUUID;
}
 61
Author: nerowolfe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-19 11:06:15

Generalnie nie używaj identifierForVendor. Zamiast tego użyj NSUUID do wygenerowania niestandardowego identyfikatora UUID i zapisz go w pęku kluczy(ponieważ pęk kluczy nie zostanie usunięty, jeśli aplikacja zostanie usunięta i ponownie zainstalowana).

 19
Author: Wain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-19 11:05:45

Dodanie do @nerowolfe ' S odpowiedź.

SSKeychain używa kSecAttrSynchronizableAny jako domyślnego trybu synchronizacji. Prawdopodobnie nie chcesz, aby identifierForVendor Była synchronizowana między wieloma urządzeniami, więc oto kod:

// save identifierForVendor in keychain without sync
NSError *error = nil;
SSKeychainQuery *query = [[SSKeychainQuery alloc] init];
query.service = @"your_service";
query.account = @"your_account";
query.password = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
query.synchronizationMode = SSKeychainQuerySynchronizationModeNo;
[query save:&error];
 9
Author: griga13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:02

Możesz spróbować użyć pęku kluczy, aby zapisać swój VendorIdentifier, który będzie istniał do momentu resetowania urządzenia, nawet jeśli odinstalujesz aplikację.

 5
Author: iphonic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-19 11:06:07

Ok. Nie chciałem używać strony trzeciej-mianowicie SSKeychain. Więc to jest kod, który próbowałem, dość prosty i działa dobrze:

    NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:bundleId accessGroup:nil];
if(![keychainItem objectForKey:(__bridge id)(kSecValueData)]){
    NSString *idfa = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    [keychainItem setObject:idfa forKey:(__bridge id)(kSecValueData)];
    NSLog(@"saving item %@", [keychainItem objectForKey:(__bridge id)(kSecValueData)]);
}else{
    NSLog(@"saved item is %@", [keychainItem objectForKey:(__bridge id)(kSecValueData)]);
}
 4
Author: Gautam Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-14 14:06:56

Wersja Swift

func UUID() -> String {

    let bundleName = NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String
    let accountName = "incoding"

    var applicationUUID = SAMKeychain.passwordForService(bundleName, account: accountName)

    if applicationUUID == nil {

        applicationUUID = UIDevice.currentDevice().identifierForVendor!.UUIDString

        // Save applicationUUID in keychain without synchronization
        let query = SAMKeychainQuery()
        query.service = bundleName
        query.account = accountName
        query.password = applicationUUID
        query.synchronizationMode = SAMKeychainQuerySynchronizationMode.No

        do {
            try query.save()
        } catch let error as NSError {
            print("SAMKeychainQuery Exception: \(error)")
        }
    }

    return applicationUUID
}
 4
Author: Michael Kalinin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 13:58:13

Nie ma już określonego sposobu łączenia unikalnego numeru z urządzeniem, nie jest to dozwolone zgodnie z wytycznymi Apple dotyczącymi prywatności.

Możesz spróbować zapisać swój unikalny identyfikator w pęku kluczy, ale jeśli użytkownik wyczyści swoje urządzenie, ten identyfikator również zniknie.

Ogólnie jest to po prostu złe, aby połączyć urządzenie z użytkownikiem, ponieważ nie są już identyfikujące użytkowników, ale urządzenia. Powinieneś więc po prostu zmienić swoje API, aby użytkownik mógł ponownie się zalogować i aby identyfikator dostawcy był powiązany z użytkownikami konto.

Również co się dzieje, gdy użytkownik ma więcej niż jedno urządzenie, jak iPhone i iPad, i korzysta z aplikacji na obu? Ponieważ uwierzytelnianie opiera się na unikalnym identyfikatorze, nie można tego zrobić.

 1
Author: rckoenes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-19 11:13:58

Użyłemkeychainaccess pod do tego problemu.

W Twoim pliku pod:

pod 'KeychainAccess', '~> 2.4' //If you are using Swift 2.3 
pod 'KeychainAccess' //Defaults to 3.0.1 which is in Swift 3

Importuj KeychainAccess moduł do pliku, w którym chcesz ustawić UUID w pęku kluczy

import KeychainAccess

Użyj poniższego kodu, aby ustawić i pobrać UUID z pęku kluczy:

Uwaga : BundleId jest kluczem, a uuid wartością

var bundleID = NSBundle.mainBundle().bundleIdentifier
    var uuidValue = UIDevice.currentDevice().identifierForVendor!.UUIDString

 //MARK: - setVenderId and getVenderId
    func setVenderId() {

        let keychain = Keychain(service: bundleID!)

        do {
            try keychain.set(venderId as String, key: bundleID!)
            print("venderId set : key \(bundleID) and value: \(venderId)")
        }
        catch let error {
            print("Could not save data in Keychain : \(error)")
        }
    }

    func getVenderId() -> String {
        let keychain = Keychain(service: bundleID!)
        let token : String = try! keychain.get(bundleID!)!
        return token
    }
 1
Author: Jayprakash Dubey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-11 09:03:56