4

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

使用ACAccountCredential'soauthToken方法,它返回null. 我的问题是,有可能以某种方式获得 oauth 令牌吗?

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

谢谢

4

3 回答 3

2

(编辑以解决@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
于 2013-07-26T16:39:55.303 回答
0

似乎有时,由于一个人的开发过程或时间到期,应用程序的 Facebook 凭据可能会变得无效。此时,调用account.credential将返回无效或零。在这种情况下,您必须更新凭证。为此,只需调用-renewCredentialsForAccount:completion:相关帐户即可。对于 Facebook 帐户,这将自动更新 oauth 令牌。

对于其他服务类型,可能会提示用户输入密码,请在这种情况下查看文档。

于 2014-12-20T04:25:29.033 回答
0

我遇到了完全相同的问题。对我来说,问题是我在完成处理程序中设置了我的 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;
        });
        ...
    }
];
于 2015-02-01T07:18:17.010 回答