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 ?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;
}
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).
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];
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ę.
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)]);
}
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
}
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ć.
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
}
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