Facebook最佳身份验证流程与Accounts.framework

时间:2014-07-27 11:45:17

标签: ios facebook

我已经阅读了大量关于ACAccounts.framework的信息并成功将其集成到我的应用程序中。

说实话,所有教程都没有良好的错误流程以及下一步该做什么。

我的以下身份验证工作正常:

ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSDictionary *options = @{
                              ACFacebookAppIdKey : kPSFacebookKey,
                              ACFacebookPermissionsKey : @[@"email"],
                              ACFacebookAudienceKey : ACFacebookAudienceEveryone};

    [accountStore requestAccessToAccountsWithType:accountType
                                          options:options
                                       completion:^(BOOL granted, NSError *error){
        if (granted) {
            NSArray *accounts = [_currentUser.accountStore
                                 accountsWithAccountType:accountType];
            _currentUser.facebook = [accounts firstObject];                
            dispatch_async(dispatch_get_main_queue(), ^{
                authSuccess(); 
            });
        } else {
            dispatch_async(dispatch_get_main_queue(), ^{
                authFailure(error);
                // Display UIAlertView to make user go to settings and add account?! WHAT?
            });
        }
    }];

如果用户在设置中拥有帐户,我依赖它并认为该用户已登录。

这确实按预期工作,但只要用户在settings中拥有帐户,就会被授予。 否则,我会显示提醒,以便用户转到settings并添加帐户。我不想那样!

所以,期望的流程是:

  • 如果用户在settings中拥有帐户,则通过ACAccountStore工作
  • 获取帐户
  • 如果用户在settings中没有帐户 - >转到facebook app?
  • 如果用户没有facebook应用 - >转到safari facebook登录表单 - >登录然后返回应用程序

我相信Foursquare有这样的流程。

所以我的主要问题是:

  • 我如何实现这样的流程(见上文)
  • 我需要Facebook iOS SDK
  • 我可以合并来自Facebook会话的凭据并手动将其添加到ACAccountStore吗?

感谢

1 个答案:

答案 0 :(得分:3)

我遇到了gist

https://gist.github.com/rsms/4726728

满足以下期望:

  • 如果用户在settings中有帐户通过ACAccountStore
  • 获取
  • 如果用户在settings中没有帐户 - >去facebook app
  • 如果用户没有Facebook app - >转到safari Facebook登录表单 - >输入凭证 - >自动返回应用程序

真正酷的是,我不必手动获取ACAccountStore(iOS系统中的帐户),Facebook SDK为我做,我只是依靠Facebook会话( ISOPEN)。

还有一个问题是会话在重新启动应用程序后消失了,这可以通过添加:

来解决
[FBSession openActiveSessionWithReadPermissions:nil
                                   allowLoginUI:NO
                              completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {}];