27

我正在尝试执行一个简单的发布程序:

- (IBAction)directPostClick:(id)sender {
    self.statusLabel.text = @"Waiting for authorization...";
    if (self.accountStore == nil) {
        self.accountStore = [[ACAccountStore alloc] init];
    }   
    ACAccountType * facebookAccountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSArray * permissions = @[@"publish_stream", @"user_checkins", @"publish_checkins", @"user_likes", @"user_videos"];
    NSDictionary * dict = @{ACFacebookAppIdKey : @"My app id here", ACFacebookPermissionsKey : permissions, ACFacebookAudienceKey : ACFacebookAudienceOnlyMe};
    [self.accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
        __block NSString * statusText = nil;
        if (granted) {
            statusText = @"Logged in";
            NSArray * accounts = [self.accountStore accountsWithAccountType:facebookAccountType];
            self.facebookAccount = [accounts lastObject];
            NSLog(@"account is: %@", self.facebookAccount);
            self.statusLabel.text = statusText;
            [self postToFeed];
        }
        else {
            self.statusLabel.text = @"Login failed";
            NSLog(@"error is: %@", error);
        }
    }];
} 

已编辑: 问题是当我单击 alertView 的 OK 按钮(不允许也不起作用)时,什么也没有发生!- 这种行为现在随着这个 iOS 6 Facebook 发布过程而改变,结果是“remote_app_id 与存储的 id 不匹配”所以不仅仅是“什么都没有发生”,我有一个错误“Facebook 服务器无法满足这个访问请求:remote_app_id 确实与存储的 ID 不匹配”

在此处输入图像描述

所以,似乎警报视图的点击处理程序什么都不做,我的完成处理程序永远不会被调用。我确实已经遇到了类似的问题:iOS 6 Social integration - go to settings issue 我认为这里也是同样的问题。你们怎么看?PS 我在 MAC mini、OS X 10.8.1 上运行最新的 xcode 4.5 (4G182) 并使用 iPhone 6.0 模拟器。

添加:根据 Bjorn 的请求添加该postToFeed方法,尽管它从未被调用:

- (void)postToFeed {
    NSDictionary * parameters = @{@"message" : @"Hello world!"};
    NSURL * feedUrl = [NSURL URLWithString:@"https://graph.facebook.com/me/feed"];
    SLRequest * request = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodPOST URL:feedUrl parameters:parameters];
    request.account = self.facebookAccount;
    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.statusLabel.text = @"Posted!";
        });
    }];
}
4

2 回答 2

97

在使用 Accounts Framework 和 Facebook 集成时,我也遇到了一些困难。这是我学到的东西以及我是如何让它发挥作用的。

1. 确保您在 Facebook 上正确
设置了您的 App 您需要将您的 App 与 Facebook 的集成方式设置为Native iOS App,并在指定字段中输入您的 App 的 Bundle ID。(编辑:请注意捆绑 ID 区分大小写)您现在可以将 iTunes ID 设置为 0。启用Facebook 登录并将高级设置选项卡中的App Type设置为Native/Desktop还将客户端中的 App Secret
设置为No

如果这些选项中的一个或多个未正确设置,您很可能会收到错误消息The Facebook server could not fulfill this access request: remote_app_id does not match stored id

(编辑:您还必须确保沙箱被禁用。)

2. 首次安装 Facebook 应用
程序在 iOS(和 Mac OS X 也是)上通过原生 Facebook 集成首次安装应用程序时,您必须请求基本读取权限!没有其他的email,user_birthdayuser_location在这里是允许的。使用user_about_me,根据 Facebook 文档,这也是基本的读取权限,但不起作用。如果您之前使用过 Facebook JavaScript SDK 或 Facebook PHP SDK,这会非常令人困惑,因为默认情况下它会要求您提供基本权限,而您无需执行任何操作。Facebook 还更新了他们的文档,其中包含有关如何在 iOS 6 上使用新 Facebook SDK的简短分步指南。

3. 请求额外权限
重要的是要知道,您不能同时请求读取和写入权限。这也是经验丰富的 Facebook SDK 开发人员可能会感到困惑的地方。请求read_stream权限连同publish_stream权限会导致请求失败,导致报错An app may not ask for read and write权限同时

由于 Facebook 在Permission Reference中并没有真正区分读/写权限,因此您必须自己识别写权限。它们通常以 , 为前缀,manage_*或以 . 为后缀。publish_*create_**_management

Facebook 也不建议在获得基本权限后立即请求额外权限。文档说“您现在需要单独(并按此顺序)请求读取和发布权限。很可能,您将在应用程序启动并且用户首次登录时请求个性化的读取权限。稍后,如果合适,您的当应用程序打算向 Facebook 发布数据时,它可以请求发布权限。[...] 分别请求这两种类型也大大提高了用户授予发布权限的机会,因为您的应用程序只会在需要的时候寻求它们它们,最有可能是当用户有更强烈的意图时。”。

4. 示例代码
以下示例代码应该适用于 iOS 和 Mac OS X:

ACAccountType * facebookAccountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

// At first, we only ask for the basic read permission
NSArray * permissions = @[@"email"];

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"My app id here", ACFacebookAppIdKey, permissions, ACFacebookPermissionsKey, ACFacebookAudienceOnlyMe, ACFacebookAudienceKey, nil];

[self.accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
    if (granted && error == nil) {
        /** 
        * The user granted us the basic read permission.
        * Now we can ask for more permissions
        **/
        NSArray *readPermissions = @[@"read_stream", @"read_friendlists"];
        [dict setObject:readPermissions forKey: ACFacebookPermissionsKey];

        [self.accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
            if(granted && error == nil) {
                /**
                * We now should have some read permission
                * Now we may ask for write permissions or
                    * do something else.
                **/
            } else {
                NSLog(@"error is: %@",[error description]);
            }
        }];
    } else {
        NSLog(@"error is: %@",[error description]);
    }
}];
于 2012-10-02T08:58:38.500 回答
12

如果您尝试从非开发人员用户的应用程序访问 facebook 帐户,请确保sandbox mode未激活。

于 2013-04-11T08:00:34.183 回答