2016-04-11 13 views
0

Ich benutze eine Rails API mit meiner iOS App und wenn ich einen Benutzer erstelle, speichere ich die Antwort für den Benutzer im Schlüsselbund. Dinge wie die Benutzer auth_token, E-Mail usw. Eines der Json-Feld in der Antwort ist ein Boolean namens teecher.Wie man NSNumber in Keychain speichert iOS

Ich habe Mühe herauszufinden, wie ich das vom Schlüsselbund speichern und abrufen kann. Ich habe meinen vorhandenen Code für meinen Anmeldeinformationenspeicher angefügt, der derzeit die Details speichert.

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.mDies ist, wo ich bin zu kämpfen einzurichten

#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 

Schließlich hier ist der Code, wenn ich nehme Den JSON bekomme ich von der Antwort zurück und sende es zum Berechtigungsspeicher. Denken Sie daran, ich verlasse, wo ich den Berechtigungsnachweis speichern und Variablen einrichten.

[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

Umwandlung ich keinen Versuch sehe den 'teacher' Wert im Code zu speichern. – alediaferia

Antwort

1

Versuchen NSNumber in NSString wie diese

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

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

Wird dies eine gute Option sein, als wenn ich den boolean abrufen und abfragen muss. Ich muss zurück von String zu Zahl und Zahl in Boolean konvertieren. – jckly

+0

Ich habe die Antwort bearbeitet. Wie auch immer, da Keychain nur erlaubt, NSData zu speichern, müssen Sie einen Weg finden, den booleschen Wert in Daten wie oben zu konvertieren. –