2016-09-05 98 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 –