5

Accounts.framework由于 Mountain Lion 现在正式集成了 Facebook ,我想在Social.frameworkOS X上玩一点。

我在 Facebook 开发者应用程序中设置了一个应用程序,并使用以下代码请求访问已登录用户的 Facebook 帐户:

ACAccountStore *acStore = [[ACAccountStore alloc] init];
ACAccountType *accType = [acStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:FB_APP_ID, ACFacebookAppIdKey, @"read_stream, publish_stream", ACFacebookPermissionsKey, ACFacebookAudienceFriends, ACFacebookAudienceKey, nil];


[acStore requestAccessToAccountsWithType:accType options:options completion:^(BOOL granted, NSError *error) {
    if (granted) {
        NSLog(@"Accounts: %@", acStore.accounts);
        NSLog(@"Access granted");
    } else {
        NSLog(@"Access denied");
    }
}];

现在我总是得到错误Error Domain=XPCObjectsErrorDomain Code=2 "The operation couldn’t be completed. (XPCObjectsErrorDomain error 2.)"

当我第一次从 Xcode 启动应用程序 2-3 次时,OS X 显示确认对话框“XYZ 想要访问您的 Facebook 帐户”,我点击确定,我收到一条错误消息,提示“应用程序尚未安装”。这个错误现在“消失了”,我收到了上面提到的错误。

我的问题是:我是否必须在我的 Xcode 项目 (Info.plist) 或 Facebook 开发者应用程序中配置一些特殊的东西才能使其与 OS X 一起使用?还是我在代码中遗漏了什么?关于此的示例和教程似乎非常罕见:-/

我已经观看了关于 Twitter/Facebook 集成的 WWDC 2012 视频,但它几乎完全使用了我使用的代码。

任何帮助表示赞赏:-)

干杯,比约恩

更新
我解决了这个问题,我只是没有仔细阅读文档;-) 我必须将权限作为 NSArray 而不是作为字符串传递。我已将选项字典修改为如下所示:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: FB_APP_ID, ACFacebookAppIdKey, [NSArray arrayWithObjects:@"read_stream", @"publish_stream", @"email", @"user_likes", nil], ACFacebookPermissionsKey, ACFacebookAudienceFriends, ACFacebookAudienceKey, nil];

现在 OS X 显示一条警告,询问我是否要允许该应用代表我发布到 Facebook,我单击确定并出现一个新错误,导致无法访问 Facebook 帐户:

Error Domain=com.apple.accounts Code=7 "The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time."

我已经将权限修改为 justemail或 just user_likes,但都导致了相同的错误。如果我只请求访问read_stream权限被授予但导致 OAuth 错误 190 并显示消息Error validating access token: User XXXXXX has not authorized application XXXXXX.

更新 2:
我现在解决了所有问题,请参阅下面的答案。

4

2 回答 2

11

好吧,我终于解决了:-)

当您首次请求访问用户 Facebook 帐户时,您只能向Facebook 权限参考中“用户和朋友权限”下列出的用户请求权限。

一旦用户授予访问权限并同时在 Facebook 上安装了应用程序,您可以请求您的应用程序所需的任何其他权限。重要的是,您不能一个接一个地同时请求读取和写入权限!read_stream因此,在同一个请求中请求许可publish_stream将不起作用。

这基本上是我使用的代码:

self.store = [[ACAccountStore alloc] init];

ACAccountType *accType = [self.store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

NSMutableDictionary *options = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                    FB_APP_ID, ACFacebookAppIdKey,
                                    [NSArray arrayWithObjects:@"email", @"user_about_me", @"user_likes", nil], ACFacebookPermissionsKey, ACFacebookAudienceFriends, ACFacebookAudienceKey, nil];    

[self.store requestAccessToAccountsWithType:accType options:options completion:^(BOOL granted, NSError *error) {
    if (granted && error == nil) {
        self.accounts = self.store.accounts;    
        [options setObject:[NSArray arrayWithObjects:@"read_stream, read_mailbox, read_requests", nil] forKey:ACFacebookPermissionsKey];
        [self.store requestAccessToAccountsWithType:accType options:options completion:^(BOOL granted, NSError *error) {
            if (granted && error == nil) {
                completionHandler(granted, error);
            } else {
                NSLog(@"Access denied 2");
                NSLog(@"%@", [error description]);
            }
        }];
    } else {
        NSLog(@"Error: %@", [error description]);
        NSLog(@"Access denied");
    }
}];

希望这会对某人有所帮助:-)

于 2012-09-25T16:00:10.107 回答
2

我想补充一点,Facebook 文档中有一个额外的警告:

// if a user has *never* logged into your app, you MUST include one of
// "email", "user_location", or "user_birthday".  Other read 
// permissions can also be included here.

不这样做会导致同样的错误。

于 2012-12-11T23:22:24.590 回答