2016-09-05 95 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

我也有類似的問題,當我加入鑰匙扣共享享它是固定的。

有關如何啓用鑰匙扣分享更多的細節: 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 –