Ios 当通过帐户框架请求访问Facebook时,是否可以获得oauth令牌?

Ios 当通过帐户框架请求访问Facebook时,是否可以获得oauth令牌?,ios,objective-c,cocoa-touch,Ios,Objective C,Cocoa Touch,我需要在服务器的后台进行一些API调用,这就是我需要oauth令牌的原因 使用ACAccountCredential的oauthToken方法,它返回null。我的问题是,是否有可能以某种方式获得oauth令牌 例如Instagram就是这样做的。他们通过Accounts框架进行身份验证,并将令牌发送到他们的服务器,在那里进行所有的graph API调用 谢谢(编辑以回应@0xSina的评论) 对。我知道您已尝试访问Facebook ACAccount对象的ACAccountCredential

我需要在服务器的后台进行一些API调用,这就是我需要oauth令牌的原因

使用
ACAccountCredential
oauthToken
方法,它返回
null
。我的问题是,是否有可能以某种方式获得oauth令牌

例如Instagram就是这样做的。他们通过Accounts框架进行身份验证,并将令牌发送到他们的服务器,在那里进行所有的graph API调用

谢谢

(编辑以回应@0xSina的评论)

对。我知道您已尝试访问Facebook ACAccount对象的
ACAccountCredential
的oauthToken属性,并且返回nil。这就是说,这是一种方法,当所有设置都正确时,它不会返回
nil

我创建了一个测试项目来证明这一点,下面是相关代码。需要检查的几件事:

1) 在Facebook应用程序信息页面上,确保在本机iOS应用程序部分设置了捆绑包ID

2) (很明显)确保你在iOS设置中设置了Facebook帐户

3) 如果您无法让主项目正常工作,请尝试一个空的测试项目,就像我所做的那样,看看它是否有效。您必须记住将测试项目的bundleID设置为与您在Facebook设置页面上输入的内容相匹配

下面是代码,其中包含一些断言,用于在出现故障时通知您:

- (void) viewDidAppear:(BOOL)animated
{
    ACAccountStore* as = [ACAccountStore new];

    ACAccountType* fbat = [as accountTypeWithAccountTypeIdentifier: ACAccountTypeIdentifierFacebook];
    NSAssert( fbat != nil, @"oops, can't find account-type for facebook!");

    [as requestAccessToAccountsWithType: fbat

                                options: @{ ACFacebookAppIdKey : @"99999999999", // your FB appid here!
                                            ACFacebookPermissionsKey : @[ @"email" ] }

                             completion: ^(BOOL granted, NSError *error) {

                                 NSAssert( granted && error==nil, @"oops, access not granted!");

                                 if ( granted )
                                 {
                                     NSArray* accounts = [as accountsWithAccountType: fbat];
                                     NSAssert( accounts.count > 0, @"oops, no accounts??" );

                                     ACAccount* fbaccount = [accounts lastObject];

                                     ACAccountCredential* ac = [fbaccount credential];
                                     NSAssert( ac != nil, @"oops, no credential??" );

                                     NSString* token = [ac oauthToken];
                                     NSAssert( token.length > 0, @"oops, no credential??" );

                                     NSLog( @"token=%@", token );
                                 }
                             }];


}
我认为,一个常见的问题是将
ACFacebookPermissionsKey
错误地格式化为字符串,而不是字符串数组。或者完全放弃它,因为文件说它是可选的(不是。)

这是我测试的输出(稍微修改了一下,所以我没有在这里发布真正的令牌)


似乎有时候,无论是由于开发过程还是定时过期,应用程序的Facebook凭据都可能变得无效。此时,对
account.credential
的调用将返回invalid或nil。在这种情况下,您必须续订凭据。要做到这一点,只需对相关帐户调用
-renewCredentialsForAccount:completion:
。对于Facebook帐户,这将自动续订oauth令牌


对于其他服务类型,可能会提示用户输入密码,请检查本例中的文档。

我遇到了完全相同的问题。我遇到的问题是,我在完成处理程序中设置了我的Facebook帐户:
requestAccessToAccountsWithType
,然后试图用另一个函数访问
accountcredential

在完成处理程序中获取oauth令牌并将其保存以供以后使用,为我解决了这个问题:

[account requestAccessToAccountsWithType:accountType options:options completion:
    ^(BOOL granted, NSError *error) {
        ...    
        dispatch_async(dispatch_get_main_queue(), ^{
            facebookAccount = [arrayOfAccounts lastObject];
            oAuthToken = facebookAccount.credential.oauthToken;
        });
        ...
    }
];

如果您阅读了我的问题,它会说:使用ACAccountCredential的oauthToken方法,它将返回null。我以前见过这个问题。在您链接的问题的答案中:“很遗憾,我们不能使用[self.fbAccount credential];-此方法返回null-只需查看文档”@0xSina-我确实仔细阅读了您的问题。我认为您的应用程序中存在其他错误,导致令牌返回nil。请在一个空的示例应用中尝试我的更新代码-如果它仍然失败,那么我可以尝试为您发布我的完整示例项目。我的道歉,也许我错了…只是对这个问题感到失望。。。我将用完整的源代码更新我的问题。
[account requestAccessToAccountsWithType:accountType options:options completion:
    ^(BOOL granted, NSError *error) {
        ...    
        dispatch_async(dispatch_get_main_queue(), ^{
            facebookAccount = [arrayOfAccounts lastObject];
            oAuthToken = facebookAccount.credential.oauthToken;
        });
        ...
    }
];