如何首次检测iOS应用是否已安装或已删除并重新安装?
我在应用运行时使用NSUserDefaults
。但是,当应用程序被删除时,我相信所有相关数据都会被删除。
我的目标是仅在首次在设备上安装应用时对用户电话号码进行短信验证。
如果出于某种原因,该应用已被删除并重新安装,我希望避免重做短信验证。
我还能做什么?我可以存储与我的应用程序相关的一些元数据,当应用程序本身在设备上删除时,这些元数据不会被删除吗?
要遵循的任何标准模式?
答案 0 :(得分:3)
您可以通过在用户的钥匙串中存储值来实现此目的。即使应用程序被删除,它也会持续存在,因此您可以判断该应用程序是新安装还是重新安装。将另一个值添加到用户默认值以进行比较,如果两个值都存在,则应用程序已安装并执行至少一次。如果两个值都不存在,则它是新的首次安装。如果仅存在钥匙串值,则重新安装。
答案 1 :(得分:0)
单独使用iOS
无法实现此目的,但您可以通过使用服务器和数据库来实现此目的,并且第一次运行应用时发送{ {1}} device's UDID
;如果服务器已经有server
,那么该应用程序已经安装。
当然,此解决方案确实要求用户具有互联网连接。
答案 2 :(得分:0)
您可以使用钥匙串,钥匙串会在我们卸载应用程序后存储值。
Apple在他们的GenericKeyChain(sample code)中提供了KeyChainItemWrapper类
答案 3 :(得分:0)
尝试使用此代码将设备代码存储在钥匙串中.....即使删除了应用,钥匙串值也会保持不变:
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;
}
答案 4 :(得分:0)
我认为,您将UDID发送到icloud Apple进行存储。如果app第一次安装。没有找到Icloud iphone,否则它会有UDID。你需要服务器。