ACAccountType 始终显示 0 个帐户

Posted

技术标签:

【中文标题】ACAccountType 始终显示 0 个帐户【英文标题】:ACAccountType always showing 0 accounts 【发布时间】:2013-06-18 07:11:13 【问题描述】:

我已使用 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 帐户。请帮我找出这个问题。

谢谢大家。

【问题讨论】:

你给requestAccessToAccountsWithType:options:completion:打过电话吗? @Wain 我应该在哪里称呼它? 【参考方案1】:

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

将您的备份基于 Web 的身份验证转换为其他方法,然后检查您是否可以按原样创建帐户存储。如果没有,请调用 web 方法。如果可以,请尝试使用requestAccessToAccountsWithType:options:completion: 访问 FB 帐户。在完成块中,您将被授予访问权限,或者您将调用 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];
                                        
                                        );
                                    ];

【讨论】:

显示此错误 -[FBSession checkThreadAffinity] NSInternalInconsistencyException',原因:'FBSession: 只能在单线程中使用' 显示此错误 -[FBSession checkThreadAffinity] NSInternalInconsistencyException',原因:'FBSession: 只能在单线程中使用' 您还尝试在哪里与 FB 交互以及在哪个线程上进行交互?从技术上讲,在完成块中,您应该切换回主线程以确保安全。 如果你能把代码上传到github/粘贴/东西我可以稍后看看。

以上是关于ACAccountType 始终显示 0 个帐户的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 分享并始终询问该帐户

始终提示用户在应用程序启动时选择一个帐户

内层div使用了float的css样式之后,外层div高度始终为0,解决方法

我用countif函数统计时,最后显示的数字始终是0,是怎么回事?

在VSTS上使用多个SSH密钥

Jasper Reports在显示组详细信息之前总结了所有组