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