在我的iOS应用程序中,SSKeychain的证书存储有一个奇怪的bug。当用户登录时,我会在凭据存储中存储一堆信息。但是最近凭据存储没有设置这些项。
奇怪的是,这种情况并不总是发生。有时它会设置信息并按预期工作。其他情况下,凭据存储值在登录后返回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%,这就是令人困惑的地方。我也在努力在模拟器上重现这个问题。
如果有人有什么想法的话?或者需要看到更多代码,请让我知道。
发布于 2016-09-08 04:24:19
我也遇到过类似的问题,当我添加了Keychain共享权限时,这个问题就解决了。
有关如何启用密钥链共享的更多详细信息,请访问:https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582-CH26-SW15
发布于 2016-09-05 19:22:30
我想你忘了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];
}
}https://stackoverflow.com/questions/39329338
复制相似问题