首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否未正确设置SSKeychain凭据存储?

是否未正确设置SSKeychain凭据存储?
EN

Stack Overflow用户
提问于 2016-09-05 19:11:02
回答 2查看 352关注 0票数 0

在我的iOS应用程序中,SSKeychain的证书存储有一个奇怪的bug。当用户登录时,我会在凭据存储中存储一堆信息。但是最近凭据存储没有设置这些项。

奇怪的是,这种情况并不总是发生。有时它会设置信息并按预期工作。其他情况下,凭据存储值在登录后返回nil。我的代码如下所示:

代码语言:javascript
运行
复制
- (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%,这就是令人困惑的地方。我也在努力在模拟器上重现这个问题。

如果有人有什么想法的话?或者需要看到更多代码,请让我知道。

EN

回答 2

Stack Overflow用户

发布于 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

票数 1
EN

Stack Overflow用户

发布于 2016-09-05 19:22:30

我想你忘了resume你的网络电话了。如果它有效,请尝试下面的方法,

代码语言:javascript
运行
复制
 - (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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39329338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档