2016-09-05 5 views
0

Ich habe einen seltsamen Bug mit SSKeychains Credentialstore in meiner iOS App. Wenn sich ein Benutzer anmeldet, speichere ich eine Menge Informationen im Anmeldeinformationsspeicher. Aber kürzlich hat der Anmeldeinformationenspeicher die Elemente nicht festgelegt.SSKeychain-Berechtigungsnachweis wird nicht ordnungsgemäß eingerichtet?

Was komisch ist, passiert nicht die ganze Zeit. Manchmal legt es die Informationen fest und funktioniert wie erwartet. In anderen Fällen geben die Werte des Berechtigungsnachweisspeichers nach der Anmeldung nil zurück. Mein Code sieht wie folgt aus:

- (void)login:(id)sender { 
    [SVProgressHUD show]; 

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
    [manager setResponseSerializer:[LoginResponseSerializer serializer]]; 

    __weak typeof(self)weakSelf = self; 

    NSString *urlString = [NSString stringWithFormat:@"%s%s", kBaseURL, kLoginURL]; 

    if (self.passwordField.text && self.emailField.text) { 
     NSDictionary *params = @{ @"email": self.emailField.text, @"password": self.passwordField.text}; 

     self.sessionManager = manager; 
     [manager POST:urlString parameters:params progress:^(NSProgress * _Nonnull uploadProgress) { 
      // prgress implementation 
     } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
      NSDictionary *user = [responseObject objectForKey:@"user"]; 



      NSString *token = user[@"auth_token"]; 
      NSString *avatarURL = user[@"avatar_url"]; 
      NSString *userID = [NSString stringWithFormat: @"%@", user[@"id"]]; 
      NSString *firstName = user[@"first_name"]; 
      NSString *lastName = user[@"last_name"]; 
      NSString *levelOfStudy = user[@"level"]; 

      BOOL teecher = [user[@"teecher"] boolValue]; 

      [weakSelf.credentialStore setTeecher:teecher]; 
      [weakSelf.credentialStore setUserId:userID]; 
      [weakSelf.credentialStore setAvatarURL:avatarURL]; 
      [weakSelf.credentialStore setAuthToken:token]; 
      [weakSelf.credentialStore setFirstName:firstName]; 
      [weakSelf.credentialStore setLastName:lastName]; 
      [weakSelf.credentialStore setLevelOfStudy:levelOfStudy]; 

      [weakSelf.credentialStore setEmail:self.emailField.text]; 
      [weakSelf.credentialStore setPassword:self.passwordField.text]; 

      AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
      [manager.requestSerializer setValue:token forHTTPHeaderField:@"auth_token"]; 
      [manager setResponseSerializer:[CustomerResponseSerializer serializer]]; 
      NSString *urlString = [NSString stringWithFormat:@"%s%s", kBaseURL, kCustomerURL]; 

      [manager GET:urlString parameters:nil progress:^(NSProgress * _Nonnull uploadProgress) { 
       // progress implementation 
      } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
       NSDictionary *sources = [responseObject objectForKey:@"sources"]; 
       NSArray *cards = (NSArray *)sources[@"data"]; 
       [weakSelf.credentialStore setHasCreditCard:(cards.count > 0)]; 
       [weakSelf.credentialStore setSignUp:false]; 
       [SVProgressHUD dismiss]; 
       [self.navigationController popViewControllerAnimated:NO]; 
      } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
       [SVProgressHUD showErrorWithStatus:@"Failed to refresh cards."]; 

      }]; 
     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
      [SVProgressHUD showErrorWithStatus:@"Login Failed"]; 

     }]; 
    } 
} 

Wie man auf Erfolg sehen können speichere ich die Elemente in dem Speicher der Anmeldeinformationen aber diese derzeit ein Glück Spiel, in dem es 40% der Zeit arbeitet und nicht mehr als 60%, was ist, was verwirrend. Ich bemühe mich auch, das Problem am Simulator neu zu erstellen.

Wenn jemand Ideen hat? oder muss mehr Code sehen lassen Sie es mich wissen.

+0

Sind Sie nur diese in den Simulator zu bemerken? Ich hatte ähnliche Probleme, bei denen Daten nicht herausgezogen wurden und unregelmäßiges Verhalten aufwiesen. Ein Neustart von Xcode und dem Simulator schien zu helfen, kam aber manchmal wieder zurück. Ich denke, das ist nur etwas seltsam an der neuesten Version von Xcode und weniger an SSKeychain. –

+0

Außerdem wurde SSKeychain zum Zeitpunkt dieses Schreibens zugunsten von SAMKeychain veraltet. Gleiche Klassen und Verhalten, also sollten Sie nur Ihre Instanzen von SSKeychain in SAMKeychain umbenennen. –

+0

Es passiert tatsächlich auf meinem Gerät und im Simulator. ah vielleicht Upgrade auf SAMKeychain und sehen, ob das hilft – jckly

Antwort

0

Ich denke, Sie vergessen resume Ihr Netzwerk anrufen. versuchen Sie wie unten, wenn es funktioniert,

- (void)login:(id)sender { 

[SVProgressHUD show]; 

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
[manager setResponseSerializer:[LoginResponseSerializer serializer]]; 

__weak typeof(self)weakSelf = self; 

NSString *urlString = [NSString stringWithFormat:@"%s%s", kBaseURL, kLoginURL]; 

if (self.passwordField.text && self.emailField.text) { 
    NSDictionary *params = @{ @"email": self.emailField.text, @"password": self.passwordField.text}; 

    self.sessionManager = manager; 

    [[manager POST:urlString parameters:params progress:^(NSProgress * _Nonnull uploadProgress) { 
     // prgress implementation 
    } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
     NSDictionary *user = [responseObject objectForKey:@"user"]; 


     NSString *token = user[@"auth_token"]; 
     NSString *avatarURL = user[@"avatar_url"]; 
     NSString *userID = [NSString stringWithFormat: @"%@", user[@"id"]]; 
     NSString *firstName = user[@"first_name"]; 
     NSString *lastName = user[@"last_name"]; 
     NSString *levelOfStudy = user[@"level"]; 

     BOOL teecher = [user[@"teecher"] boolValue]; 

     [weakSelf.credentialStore setTeecher:teecher]; 
     [weakSelf.credentialStore setUserId:userID]; 
     [weakSelf.credentialStore setAvatarURL:avatarURL]; 
     [weakSelf.credentialStore setAuthToken:token]; 
     [weakSelf.credentialStore setFirstName:firstName]; 
     [weakSelf.credentialStore setLastName:lastName]; 
     [weakSelf.credentialStore setLevelOfStudy:levelOfStudy]; 

     [weakSelf.credentialStore setEmail:self.emailField.text]; 
     [weakSelf.credentialStore setPassword:self.passwordField.text]; 

     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
     [manager.requestSerializer setValue:token forHTTPHeaderField:@"auth_token"]; 
     [manager setResponseSerializer:[CustomerResponseSerializer serializer]]; 
     NSString *urlString = [NSString stringWithFormat:@"%s%s", kBaseURL, kCustomerURL]; 

     [[manager GET:urlString parameters:nil progress:^(NSProgress * _Nonnull uploadProgress) { 
      // progress implementation 
     } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
      NSDictionary *sources = [responseObject objectForKey:@"sources"]; 
      NSArray *cards = (NSArray *)sources[@"data"]; 
      [weakSelf.credentialStore setHasCreditCard:(cards.count > 0)]; 
      [weakSelf.credentialStore setSignUp:false]; 
      [SVProgressHUD dismiss]; 
      [self.navigationController popViewControllerAnimated:NO]; 
     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
      [SVProgressHUD showErrorWithStatus:@"Failed to refresh cards."]; 

     }] resume]; 
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
     [SVProgressHUD showErrorWithStatus:@"Login Failed"]; 

    }] resume]; 
} 



} 
+0

Leider kein Glück. Danke für den Vorschlag. – jckly

1

Ich hatte ein ähnliches Problem und es wurde behoben, als ich Keychain Sharing-Berechtigungen hinzugefügt.

Weitere Informationen dazu, wie Schlüsselanhänger-Sharing zu aktivieren: https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582-CH26-SW15

+0

Aktualisierung auf SAMKeychain 1.5.2 und aktivieren Keychain Sharing löste meine Probleme. In Ihrem Fall könnte es auch ein Problem mit Sonderzeichen geben, es gibt einen dokumentierten Bug bei SAMKeychain: https://github.com/soffes/SAMKeychain/issues/13 –

Verwandte Themen