2016-09-05 7 views
0

iOSアプリでSSKeychainの資格情報ストアに奇妙なバグがあります。ユーザーがログインすると、資格情報ストアに多数の情報が保存されます。しかし、最近、資格情報ストアはアイテムを設定していません。SSKeychain資格情報ストアが正しく設定されていませんか?

奇妙なことは、常に起こるわけではありません。場合によっては情報を設定し、期待どおりに動作します。ログイン後に資格情報ストアの値がnilを返す場合もあります。

- (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"]; 

     }]; 
    } 
} 

あなたが成功を見ることができるように、私は資格証明ストアにアイテムを保存するが、それは時間の40%を働き、何でない60%を行い、この現在運ゲーム:私のコードは次のようになります混乱する。また、シミュレータで問題を再現するのにも苦労しています。

誰かにアイデアがあれば、より多くのコードを参照する必要があります私に教えてください。

+0

あなただけのシミュレータでこれを気づいていますか?私はデータが引き出されず、不規則な振る舞いをしていたのと同様の問題を抱えていました。 Xcodeの再起動とシミュレータが役立つように見えましたが、時には再び戻ってくることがありました。私は、これがXcodeの最新バージョンとSSKeychainについては奇妙なことだと思います。 –

+0

また、この執筆時点では、SSKeychainはSAMKeychainのために廃止されました。同じクラスとビヘイビアなので、SSKeychainのインスタンスの名前をSAMKeychainに変更するだけで済みます。 –

+0

私のデバイスとシミュレータで実際に起こっています。ああ、SAMKeychainにアップグレードして助けてくれるかどうかを確認してください。 – jckly

答えて

0

私はあなたのネットワークコールresumeを忘れてしまったと思います。

- (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

残念ながら運がありません。しかし、提案をありがとう。 – jckly

1

私はKeychain Sharing資格を追加したときも同様の問題があり、修正されました。キーホルダーの共有を有効にする方法の詳細については

https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582-CH26-SW15

+0

SAMKeychain 1.5.2にアップデートし、キーチェーンの共有を有効にすると私の問題が解決しました。あなたのケースでは、それは特殊文字の問題かもしれません、SAMKeychainに文書化されたバグがあります:https://github.com/soffes/SAMKeychain/issues/13 –

関連する問題