iOS 6的Facebook发布过程结束与“remote_app_id不匹配存储的ID”错误

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

- (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的确定button(不允许也不工作)没有任何反应! – 这个行为现在改变了这个iOS 6的Facebook发布过程结束与“remote_app_id不匹配存储的ID”所以,而不是“没有发生”我有一个错误“的Fa​​cebook服务器无法完成此访问请求:remote_app_id做不匹配存储的ID“

在这里输入图像描述

所以,似乎alert视图的click处理程序什么都不做,我的completionHandler从来没有被调用过。 我也有类似的问题: iOS 6社交整合 – 去设置问题我认为这是同样的问题在这里。 你们想怎么样? PS我正在使用最新的xcode 4.5(4G182)和使用iPhone 6.0模拟器的MAC迷你,OS X 10.8.1上运行。

ADDED:通过Bjorn的请求,添加postToFeed方法,尽pipe它从来没有被调用:

 - (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!"; }); }]; } 

在使用账户框架和Facebook整合时,我也遇到了一些困难。 以下是我学到的东西,以及我是如何工作的。

1.确保你已经正确地在Facebook上设置你的应用程序
您需要设置您的应用程序如何与Facebook集成到本机iOS应用程序,并将您的应用程序的套件IDinput指定的字段。 (编辑:请注意,捆绑包ID区分大小写)您现在可以将iTunes ID设置为0。 启用Facebooklogin并将高级设置选项卡中的应用程序types设置为Native / Desktop
同时在客户端设置应用程序密码No。

如果这些选项中的一个或多个选项设置不正确,很可能出现错误The Facebook server could not fulfill this access request: remote_app_id does not match stored id

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

2.首次安装Facebook应用程序
当首次通过iOS上的本地Facebook集成(以及Mac OS X)安装应用程序时,您只能要求获得基本的读取权限! 没有其他的emailuser_birthdayuser_location在这里是允许的。 使用user_about_me (根据Facebook文档也是基本读取权限)不起作用。 如果您以前使用过Facebook JavaScript SDK或Facebook PHP SDK,这是非常令人困惑的,因为它默认情况下要求基本权限,而不必执行某些操作。 Facebook还通过一个关于如何在iOS 6上使用新的Facebook SDK的简单指南来更新他们的文档。

3.请求额外的权限
重要的是要知道,您可能不会同时要求读取和写入权限。 这也是有经验的Facebook SDK开发人员可能会感到困惑的事情。 请求read_stream权限以及publish_stream权限将导致请求失败,从而导致错误。应用程序可能无法同时读取和写入权限

由于Facebook并未真正区分“ 权限参考”中的读/写权限,因此您必须自行确定写权限。 它们通常以manage_*publish_*create_*或后缀*_management

Facebook也不build议在获得基本权限后立即要求额外的权限。 文档中说:“现在您需要分别请求读取和发布权限(并按照顺序)。很可能,您将在应用程序启动并且用户首次login时请求读取权限进行个性化。当它打算将数据发布到Facebook时,它可以请求发布权限[…]分别询问这两种types也极大地提高了用户授予发布权限的可能性,因为你的应用只会在需要的时候他们,最有可能的时候,用户有更强烈的意图。“

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]); } }]; 

确保sandbox mode没有被激活,如果你正尝试访问非开发人员用户的应用程序的Facebook帐户。