5

我已经使用 facebook SDK 与 facebook 进行身份验证。当设置中没有启用 facebook 帐户时,单击按钮应用程序进入 safari 进行身份验证,即

if (appDelegate.session.state != FBSessionStateCreated)
    {
        appDelegate.session = [[FBSession alloc] init];
    }

    [appDelegate.session openWithCompletionHandler:^(FBSession *session,
                                                     FBSessionState status,
                                                     NSError *error) {
        // and here we make sure to update our UX according to the new session state
        [self updateView];
    }];

否则,如果启用了 facebook 帐户,则

    NSArray *fbAccounts=nil;
    ACAccountType *accountTypeFB;
    if ((_accountStore = [[ACAccountStore alloc] init]) &&
        (accountTypeFB = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){
        fbAccounts = [_accountStore accountsWithAccountType:accountTypeFB];
        NSLog(@" %d fbAccounts",[fbAccounts count]);
    }
    if ([fbAccounts count]!=0) {

        [FBSession openActiveSessionWithAllowLoginUI:YES];
        NSArray *permissions = [[NSArray alloc] initWithObjects:
                                @"email",
                                nil];

        [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
            if (error) {
                NSLog(@"Failure");
                NSLog(@"error %@",error);
            }
            else
            {
                NSLog(@" active session opened ");
                if (self.gotUserDetails)
                {
                    return;
                }
                [self fetchuserinfo];
            }
        }];
    }

在此处输入图像描述 }

此图像显示访问用户信息的警报。它在模拟器中运行良好。但在设备中,它总是去 safari 或在 facebook 应用程序中进行身份验证,即使在设置中启用了 facebook 帐户。请帮助我找到这个问题。

谢谢大家。

4

1 回答 1

1

您不能只调用accountTypeWithAccountTypeIdentifier访问 FB 帐户,您需要提供属性。这需要使用requestAccessToAccountsWithType:options:completion:并具有异步响应来完成。

将基于 Web 的备份身份验证移动到不同的方法中,然后检查是否可以按原样创建帐户存储。如果没有,请调用 web 方法。如果可以,请尝试使用 访问 FB 帐户requestAccessToAccountsWithType:options:completion:。在完成块中,您将被授予访问权限,或者您将调用 web 方法。

这段代码应该都在主线程上运行。异步响应可能会在不同的线程上调用,因此请切换回主线程以完成您的处理。


填写...部分。

- (void)webAuthorise {...}

- (void)authorise {
if(!_accountStore)
    _accountStore = [[ACAccountStore alloc] init];

ACAccountType *facebookTypeAccount = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

if (facebookTypeAccount == nil) {
    NSLog(@"Failed, No account");
    [self webAuthorise];
    return;
}

[_accountStore requestAccessToAccountsWithType:facebookTypeAccount
                                       options:@{ACFacebookAppIdKey: @"...", ACFacebookPermissionsKey: @[@"email"]}
                                    completion:^(BOOL granted, NSError *error) {
                                        dispatch_async(dispatch_get_main_queue(), ^{
                                        if(granted){
                                            NSArray *accounts = [_accountStore accountsWithAccountType:facebookTypeAccount];
                                            _facebookAccount = [accounts lastObject];
                                            NSLog(@"Success");

                                            [self ...];
                                        } else {
                                            NSLog(@"Failed, Error: %@", error);

                                            [self webAuthorise];
                                        }
                                        });
                                    }];
}
于 2013-06-18T08:04:29.893 回答