2014-11-28 4 views
2

Как определить, установлено ли приложение iOS в первый раз или было удалено и переустановлено?Как определить, установлено ли приложение iOS для новой установки или было установлено и удалено ранее?

Я использую NSUserDefaults, когда приложение работает. Однако, когда приложение будет удалено, я считаю, что все связанные данные удалены.

Моя цель - сделать SMS-подтверждение номера телефона пользователей только в том случае, если приложение было установлено в первый раз на устройстве.

Если по какой-то причине приложение было удалено и переустановлено, я хочу избежать повторной проверки SMS.

Что еще я могу сделать? Могу ли я хранить некоторые метаданные, относящиеся к моему приложению, которые не удаляются, когда само приложение удалено на устройстве?

Любой стандартный образец для подражания?

ответ

0

Там нет никакого способа сделать это с только iOS, но вы могли бы добиться этого, имея сервер с базой данных, и первый раз приложение запускается вы посылаете device's UDID вашему server; если на сервере уже есть UDID, приложение уже установлено.

Конечно, это решение требует от пользователя подключения к Интернету.

+0

Так что у меня ничего не может быть на устройстве, которое не удаляется при удалении приложения ... правильно? например. Метаданные SQLite и т. Д.? – GJain

+0

Это правильно. –

+0

большое спасибо! – GJain

2

Вы можете сделать это, сохранив значение в цепочке ключей пользователя. Он будет сохраняться, даже если приложение будет удалено, и, таким образом, вы можете узнать, является ли приложение новой установкой или переустановкой. Добавьте другое значение к значениям по умолчанию для сравнения, если оба значения существуют, приложение было установлено и выполнено хотя бы один раз. Если ни один из значений не существует, это новая, впервые установленная. Если только значение keychain существует, это новая переустановка.

+0

Хорошо, мне нужно попробовать это – GJain

0

Вы можете использовать брелок, а keychain хранит значения после удаления приложения.

компания Apple предоставила KeyChainItemWrapper класс в их GenericKeyChain (sample code)

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; 
} 

Source

0

Я думаю, вы отправить UDID в ICloud Apple, чтобы сохранить его. Если приложение установлено в первый раз. Icloud iphone не найден, иначе он будет иметь UDID. Вам не нужен сервер.

Смежные вопросы