0

iOS アプリの 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% では機能しない運ゲームであり、混乱を招きます。シミュレーターで問題を再現するのにも苦労しています。

誰かアイデアがあれば?または、より多くのコードを確認する必要があることをお知らせください。

4

2 に答える 2

1

同様の問題があり、キーチェーン共有の資格を追加したときに修正されました.

キーチェーン共有を有効にする方法の詳細については、 https ://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582-CH26- を参照してください。 SW15

于 2016-09-07T20:24:18.543 に答える
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];
}



}
于 2016-09-05T11:22:30.323 に答える