Я использую 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);
}];
Я не вижу никаких попыток для сохранения 'значения teacher' в вашем коде. – alediaferia