2016-04-11 5 views
0

Я использую rails api с моим приложением iOS, и когда я создаю пользователя, я сохраняю ответ для пользователя в цепочке ключей. Такие вещи, как пользователи auth_token, электронная почта и т. Д. Одним из полей json в ответе является логическое имя: teecher.Как хранить NSNumber в Keychain iOS

Я изо всех сил пытаюсь найти, как я могу хранить и отвлекать это от брелка. Я добавил свой существующий код для своего хранилища учетных данных, который в настоящее время сохраняет данные.

CredentialStore.h

#import <Foundation/Foundation.h> 

@interface TeechCredentialStore : NSObject 

- (BOOL) isLoggedIn; 
- (void) clearSavedCredentials; 
- (NSString *)authToken; 
- (NSString *)firstName; 
- (NSString *)lastName; 
- (NSString *)email; 
- (NSString *)password; 
- (NSString *)avatarURL; 
- (NSString *)userId; 
- (NSNumber *)teecher; 
- (void) setAuthToken: (NSString *)authToken; 
- (void) setFirstName: (NSString *)firstName; 
- (void) setLastName: (NSString *)lastName; 
- (void) setEmail: (NSString *)email; 
- (void) setPassword: (NSString *)password; 
- (void) setAvatarURL: (NSString *)avatar; 
- (void) setUserId: (NSString *)userId; 
- (void) setIsTeecher: (NSNumber *)teecher; 

@end 

CredentialStore.mЭто где я изо всех сил, чтобы создать

#define SERVICE_NAME @"Teechy" 
#define AUTH_TOKEN_KEY @"auth_token" 
#define FIRST_NAME_KEY @"first_name" 
#define LAST_NAME_KEY @"last_name" 
#define EMAIL_KEY @"email" 
#define PASSWORD_KEY @"password" 
#define AVATAR_URL @"avatar_url" 
#define USER_ID @"id" 
#define TEECHER_KEY @"teecher" 

@implementation TeechCredentialStore 

- (BOOL)isLoggedIn { 
    return [self authToken] != nil; 
} 

- (void)clearSavedCredentials { 
    [self setAuthToken:nil]; 
} 

- (NSString *)authToken { 
    return [self secureValueForKey:AUTH_TOKEN_KEY]; 
} 

- (NSString *)firstName { 
    return [self secureValueForKey:FIRST_NAME_KEY]; 
} 

- (NSString *)lastName { 
    return [self secureValueForKey:LAST_NAME_KEY]; 
} 

- (NSString *)email { 
    return [self secureValueForKey:EMAIL_KEY]; 
} 

- (NSString *)password { 
    return [self secureValueForKey:PASSWORD_KEY]; 
} 

- (NSString *)avatarURL { 
    return [self secureValueForKey:AVATAR_URL]; 
} 

- (NSString *)userId { 
    return [self secureValueForKey:USER_ID]; 
} 

- (NSNumber *)teecher { 
    return [self secureValueForKey:TEECHER_KEY]; 
} 

- (void)setAuthToken:(NSString *)authToken { 
    [self setSecureValue:authToken forKey:AUTH_TOKEN_KEY]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"token-changed" object:self]; 
} 

- (void) setFirstName:(NSString *)firstName { 
    [self setSecureValue:firstName forKey:FIRST_NAME_KEY]; 
} 

- (void) setLastName:(NSString *)lastName { 
    [self setSecureValue:lastName forKey:LAST_NAME_KEY]; 
} 

- (void) setEmail: (NSString *)email { 
    [self setSecureValue:email forKey:EMAIL_KEY]; 
} 

- (void) setPassword: (NSString *)password { 
    [self setSecureValue:password forKey:PASSWORD_KEY]; 
} 

- (void) setAvatarURL:(NSString *)avatar { 
    [self setSecureValue:avatar forKey:AVATAR_URL]; 
} 

- (void) setUserId: (NSString *)userId { 
    [self setSecureValue:userId forKey:USER_ID]; 
} 

- (void) setTeecher:(NSNumber *)teecher { 
    [self setSecureValue:teecher forKey:TEECHER_KEY]; 
} 

- (void)setSecureValue:(NSString *)value forKey:(NSString *)key { 
    if (value) { 
     [SSKeychain setPassword:value 
        forService:SERVICE_NAME 
         account:key]; 
    } else { 
     [SSKeychain deletePasswordForService:SERVICE_NAME account:key]; 
    } 
} 

- (NSString *)secureValueForKey:(NSString *)key { 
    return [SSKeychain passwordForService:SERVICE_NAME account:key]; 
} 

@end 

Наконец вот код, когда я беру json Я возвращаюсь из ответа и отправляю его в хранилище учетных данных. Не хочу забывать, что я оставляю место, где я создаю хранилище учетных данных и настраиваю переменные.

[manager POST:urlString parameters:params progress:^(NSProgress * _Nonnull uploadProgress) { 
     // prgress implementation 
     } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
      NSDictionary *JSON = [responseObject objectAtIndex:0]; 
      NSDictionary *user = JSON[@"user"]; 
      NSString *token = user[@"auth_token"]; 
      NSString *avatarURL = user[@"avatar_url"]; 


      weakSelf.credentialStore.avatarURL = avatarURL; 
      weakSelf.credentialStore.authToken = token; 
      weakSelf.credentialStore.firstName = self.firstNameField.text; 
      weakSelf.credentialStore.lastName = self.lastNameField.text; 
      weakSelf.credentialStore.email = self.emailField.text; 
      weakSelf.credentialStore.password = self.passwordField.text; 


      [SVProgressHUD dismiss]; 
      [self dismissViewControllerAnimated:YES completion:nil]; 
     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
//   if (task.isCancelled) { 
//    return; 
//   } 
      [SVProgressHUD showErrorWithStatus:@"Login Failed"]; 
      NSLog(@"%@", error); 
     }]; 
+1

Я не вижу никаких попыток для сохранения 'значения teacher' в вашем коде. – alediaferia

ответ

1

Попробуйте преобразовать NSNumber в NSString как этот

- (void) setTeecher:(BOOL)teecher { 
    [self setSecureValue:[@(teecher) stringValue] forKey:TEECHER_KEY]; 
} 

- (BOOL)teecher { 
    return [[self secureValueForKey:TEECHER_KEY] boolValue]; 
} 
+0

Будет ли это хорошим вариантом, когда мне нужно получить и запросить логическое значение. Мне придется преобразовать обратно из строки в число и число в boolean. – jckly

+0

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