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

Posted

技术标签:

【中文标题】iOS 6 Facebook 发布过程以“remote_app_id 与存储的 id 不匹配”错误结束【英文标题】:iOS 6 Facebook posting procedure ends up with "remote_app_id does not match stored id" error 【发布时间】:2012-09-28 16:54:16 【问题描述】:

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

- (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 posting procedure ends up with "remote_app_id does not match stored id" 所以我得到了一个错误,而不是“什么都没发生” “Facebook 服务器无法完成此访问请求:remote_app_id 与存储的 id 不匹配”

所以,似乎警报视图的点击处理程序什么都不做,我的完成处理程序永远不会被调用。 我已经有类似的问题了:iOS 6 Social integration - go to settings issue 我认为这是同样的问题。你们怎么看? 附言 我在 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!";
        );
    ];

【问题讨论】:

能否请您添加您的postToFeed 方法的代码? 是的,我会把它添加到底部的问题中 我不确定这是否为我解决了问题,但请确保您已在 Facebook 上正确设置了您的应用程序。将其与Facebook的集成方式设置为“Native iOS App”,填写Bundle ID(App Store ID暂时可以为0)并启用“Facebook登录”。此外,将高级选项卡中的“应用程序类型”设置为本机/桌面。您也可以将“客户端中的应用程序机密”设置为否。让我们知道这是否有助于/设置正确 我找不到“Native iOS app”复选框..其余设置正确 它在您的 Facebook 应用的“基本设置”中:“选择您的应用如何与 Facebook 集成” 【参考方案1】:

在使用 Accounts Framework 和 Facebook 集成时,我也遇到了一些困难。以下是我学到的知识以及我是如何使用它的。

1.确保您在 Facebook 上正确设置了您的应用 您需要将您的 App 与 Facebook 的集成方式设置为 Native iOS App,并在指定字段中输入您的 App 的 Bundle ID。 (编辑:请注意捆绑 ID 区分大小写)您现在可以将 iTunes ID 设置为 0。启用 Facebook 登录 并将高级设置选项卡中的 应用类型 设置为 Native/Desktop。 还将 App Secret in Client 设置为 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 集成安装应用程序时,您必须仅请求基本读取权限!此处不允许使用 emailuser_birthdayuser_location 之类的其他内容。使用user_about_me(根据 Facebook 文档也是基本读取权限)不起作用。如果您之前使用过 Facebook javascript SDK 或 Facebook php SDK,这会非常令人困惑,因为默认情况下它会要求您提供基本权限,而您无需执行任何操作。 Facebook 还更新了他们的文档,在 iOS 6 上的 how to use the new Facebook SDK 上提供了一个简短的分步指南。

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

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

Facebook 也不建议在获得基本权限后立即请求额外权限。 documentation 表示“您现在需要分别请求读取和发布权限(并按此顺序)。很可能,您将在应用程序启动和用户首次登录时请求读取权限以进行个性化。稍后,如果合适的话,您的应用程序可以在打算向 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]);
    
];

【讨论】:

在第 1 步中,请务必查看 developer.facebook.com/apps 中的高级选项卡,了解 App TypeApp Secret。此外,Facebook 表示需要“几分钟”才能访问所有服务器,但当我使用 Facebook 3.1.1 SDK 看到这一点时,我猜大概需要 3000 万。 嗨,你能告诉我 self.facebookAccount 是哪种类型吗?我的意思是我必须声明什么? @Björn Kaiser 嗨..我按照你说的设置正确,但我仍然收到此错误“Facebook 服务器无法满足此访问请求:代理应用程序无法请求发布权限,而无需事先安装。” @Björn Kaiser 是的,现在解决了,我在权限中添加了 user_about_me 现在我更改为 user_location @Björn Kaiser 但是,它没有进入这个循环 if(granted ) NSArray *accountsArray = [accountStore accountsWithAccountType:accountType]; .请帮助我@Björn Kaiser【参考方案2】:

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

【讨论】:

除了其他答案,这也有帮助 另外,测试账户也很棒。在这里制作一个脚本:gist.github.com/6971496

以上是关于iOS 6 Facebook 发布过程以“remote_app_id 与存储的 id 不匹配”错误结束的主要内容,如果未能解决你的问题,请参考以下文章

为旧版 Xcode 集成 Facebook SDK 以支持 iOS 5 和 iOS 6

装有 iOS 5 和 iOS 6 的 Facebook

ios 6 - 在应用程序中发布到 Facebook 无法在设备上运行

使用 facebook SDK for ios 6 实现 Facebook 注销

使用 facebook connect 登录 IOS 应用程序时出现冲突错误

facebook-ios-sdk 是不是使用 iOS 6 Facebook 集成来支持登录而不打开本机 Facebook 应用程序?