Ios 当通过帐户框架请求访问Facebook时,是否可以获得oauth令牌?
我需要在服务器的后台进行一些API调用,这就是我需要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
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;
});
...
}
];