2016-09-05 4 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
+0

SAMKeychain 1.5.2로 업데이트하고 키 체인 공유를 활성화하면 내 문제가 해결됩니다. 귀하의 경우에는 특수 문자에 문제가있을 수 있습니다. SAMKeychain에 문서화 된 버그가 있습니다. https://github.com/soffes/SAMKeychain/issues/13 –