我需要在服务器的后台进行一些 API 调用,这就是我需要 oauth 令牌的原因。
使用ACAccountCredential'soauthToken方法,它返回null. 我的问题是,有可能以某种方式获得 oauth 令牌吗?
例如 Instagram 就是这样做的。他们通过 Accounts 框架进行身份验证,并将令牌发送到他们的服务器,在那里他们执行所有图形 API 调用。
谢谢
我需要在服务器的后台进行一些 API 调用,这就是我需要 oauth 令牌的原因。
使用ACAccountCredential'soauthToken方法,它返回null. 我的问题是,有可能以某种方式获得 oauth 令牌吗?
例如 Instagram 就是这样做的。他们通过 Accounts 框架进行身份验证,并将令牌发送到他们的服务器,在那里他们执行所有图形 API 调用。
谢谢
(编辑以解决@0xSina 的评论)
是的。我了解到您已尝试访问ACAccountCredentialFacebook 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;
});
...
}
];