我需要在服务器的后台进行一些 API 调用,这就是我需要 oauth 令牌的原因。
使用ACAccountCredential
'soauthToken
方法,它返回null
. 我的问题是,有可能以某种方式获得 oauth 令牌吗?
例如 Instagram 就是这样做的。他们通过 Accounts 框架进行身份验证,并将令牌发送到他们的服务器,在那里他们执行所有图形 API 调用。
谢谢
我需要在服务器的后台进行一些 API 调用,这就是我需要 oauth 令牌的原因。
使用ACAccountCredential
'soauthToken
方法,它返回null
. 我的问题是,有可能以某种方式获得 oauth 令牌吗?
例如 Instagram 就是这样做的。他们通过 Accounts 框架进行身份验证,并将令牌发送到他们的服务器,在那里他们执行所有图形 API 调用。
谢谢
(编辑以解决@0xSina 的评论)
是的。我了解到您已尝试访问ACAccountCredential
Facebook ACAccount 对象的 oauthToken 属性,并且它返回 nil。nil
也就是说,这是执行此操作的方法,并且当一切设置正确时它不会返回。
我创建了一个测试项目来证明这一点,相关代码如下。需要检查的几件事:
1) 在您的 Facebook 应用信息页面上,确保您在 Native iOS App 部分设置了您的捆绑 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
为字符串而不是字符串数组。或者完全放弃它,因为文档说它是可选的(它不是。)
而且,这是我的测试的输出(略有改动,所以我没有在这里发布真正的令牌)
2013-07-26 16:54:23.699 testfb[26870:1303] token=CAAAAEZBYxezsBAK6OK9YPQIfA0GjiG7rn2XjdZBC6lZCpfAAAocr2cyEnmne9eMh59ZA4UabQyZAsdQMu0gMruxEJXJI1tFfBVTmLqNpRK31GPQvr3rXRAr50HUXI37iS46gPwXwZAroUHT7WqZCza6HcV6L35gVThBcOttWNxozj1df70XluEreM14nucSmvimjVGu5i4ZBZAUrSYLsvO
似乎有时,由于一个人的开发过程或时间到期,应用程序的 Facebook 凭据可能会变得无效。此时,调用account.credential
将返回无效或零。在这种情况下,您必须更新凭证。为此,只需调用-renewCredentialsForAccount:completion:
相关帐户即可。对于 Facebook 帐户,这将自动更新 oauth 令牌。
对于其他服务类型,可能会提示用户输入密码,请在这种情况下查看文档。
我遇到了完全相同的问题。对我来说,问题是我在完成处理程序中设置了我的 Facebook 帐户:requestAccessToAccountsWithType
然后尝试ACAccountCredential
在不同的函数中访问。
在完成处理程序中获取 oauth 令牌并将其保存以供以后解决我的问题:
[account requestAccessToAccountsWithType:accountType options:options completion:
^(BOOL granted, NSError *error) {
...
dispatch_async(dispatch_get_main_queue(), ^{
facebookAccount = [arrayOfAccounts lastObject];
oAuthToken = facebookAccount.credential.oauthToken;
});
...
}
];