[英]How can I detect if an iOS app is a new install or had been installed and deleted previously
如何檢測是首次安裝iOS應用還是已刪除並重新安裝iOS應用?
我在應用程序運行時確實使用NSUserDefaults
。 但是,刪除該應用程序后,我相信所有關聯數據都將被刪除。
我的目標是僅在設備上首次安裝該應用程序時才對用戶電話號碼進行SMS驗證。
如果由於某種原因,該應用程序被刪除並重新安裝,我想避免重做SMS驗證。
我還可以做些什么? 是否可以存儲與我的應用程序相關的一些元數據,當在設備上刪除應用程序本身時,這些元數據不會被刪除?
有遵循的標准模式嗎?
您可以通過在用戶的鑰匙串中存儲一個值來實現。 即使該應用程序被刪除,它也將持續存在,因此您可以確定該應用程序是新安裝還是重新安裝。 如果兩個值都存在,則向用戶默認值添加另一個值以進行比較,如果該應用已安裝並執行了至少一次。 如果兩個值都不存在,則為新的首次安裝。 如果僅存在鑰匙串值,則可以重新安裝。
您可以使用鑰匙串,並且在我們卸載應用程序后,鑰匙串會存儲值。
蘋果在其GenericKeyChain中提供了KeyChainItemWrapper類( 示例代碼 )
嘗試使用以下代碼將設備代碼存儲在鑰匙串中.....,即使刪除了應用程序,鑰匙串值也保持不變:
static NSString *serviceName = @"com.mycompany.myAppServiceName";
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSData *passwordData = [self searchKeychainCopyMatching:@"device--code"];
if (passwordData) {
NSString *password = [[NSString alloc] initWithData:passwordData
encoding:NSUTF8StringEncoding];
NSLog(@"pasword:=%@",password);
}
else{
[self createKeychainValue:devicecode forIdentifier:@"device--code"];
}
//[self deleteKeychainValue:@"device--code"];
return YES;
}
- (void)deleteKeychainValue:(NSString *)identifier {
NSMutableDictionary *searchDictionary = [self newSearchDictionary:identifier];
SecItemDelete((CFDictionaryRef)searchDictionary);
}
- (NSMutableDictionary *)newSearchDictionary:(NSString *)identifier {
NSMutableDictionary *searchDictionary = [[NSMutableDictionary alloc] init];
[searchDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
NSData *encodedIdentifier = [identifier dataUsingEncoding:NSUTF8StringEncoding];
[searchDictionary setObject:encodedIdentifier forKey:(id)kSecAttrGeneric];
[searchDictionary setObject:encodedIdentifier forKey:(id)kSecAttrAccount];
[searchDictionary setObject:serviceName forKey:(id)kSecAttrService];
return searchDictionary;
}
- (NSData *)searchKeychainCopyMatching:(NSString *)identifier {
NSMutableDictionary *searchDictionary = [self newSearchDictionary:identifier];
// Add search attributes
[searchDictionary setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
// Add search return types
[searchDictionary setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
NSData *result = nil;
// OSStatus status =
SecItemCopyMatching((CFDictionaryRef)searchDictionary,(__bridge CFTypeRef *)&result);
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary,
(void *)&result);
return result;
}
- (BOOL)createKeychainValue:(NSString *)password forIdentifier:(NSString *)identifier {
NSMutableDictionary *dictionary = [self newSearchDictionary:identifier];
NSData *passwordData = [password dataUsingEncoding:NSUTF8StringEncoding];
[dictionary setObject:passwordData forKey:(id)kSecValueData];
OSStatus status = SecItemAdd((CFDictionaryRef)dictionary, NULL);
if (status == errSecSuccess) {
return YES;
}
return NO;
}
僅靠iOS
無法實現此目的,但是您可以通過使用帶有數據庫的服務器來實現此目的,並且在首次運行該應用程序時,會將device's UDID
發送到您的server
; 如果服務器已經具有UDID
,則該應用程序已經安裝。
當然,此解決方案確實需要用戶具有Internet連接。
我認為,您將UDID發送到icloud Apple進行存儲。 如果是第一次安裝應用程序。 找不到icloud iphone,否則它將具有UDID。 您不需要服務器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.