iOS 6 Facebook发布过程结束于“remote_app_id与存储的id不匹配”错误 [英] iOS 6 Facebook posting procedure ends up with "remote_app_id does not match stored id" error

查看:74
本文介绍了iOS 6 Facebook发布过程结束于“remote_app_id与存储的id不匹配”错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

   - (IBAction)directPostClick:(id)sender {
self.statusLabel.text = @等待授权...;
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:@我的应用程序ID在这里,ACFacebookPermissionsKey:权限,ACFacebookAudienceKey:ACFacebookAudienceOnlyMe};
[self.accountStore requestAccessToAccountsWithType:facebookAccountType选项:dict完成:^(BOOL授予,NSError *错误){
__block NSString * statusText = nil;
if(approved){
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 = @登录失败;
NSLog(@error is:%@,error);
}
}];
}

编辑:
问题是当我点击在alertView的确定按钮(不允许不工作)没有任何反应! - 这个行为现在改变了这个

我认为这是同样的问题。你们怎么想呢?
P.S.
我正在运行在MAC mini,OS X 10.8.1与最新的xcode 4.5(4G182)和使用iPhone 6.0模拟器。



ADDED:
按照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 = @发表! ;
});
}];
}


解决方案

我也遇到了一些困难与帐户框架和Facebook整合工作。这是我学到的以及我如何工作。



1。确保您正确地在Facebook上设置了应用程序

您需要设置您的应用程序如何与Facebook集成到 Native iOS应用,然后输入您的应用程序进入指定字段。 (编辑:请注意,软件包ID区分大小写)您现在可以将iTunes ID设置为0。启用 Facebook登录,然后将高级设置标签中的应用类型设置为 Native / Desktop

另外设置客户端的App Secret



如果一个或多个这些选项设置不正确,很有可能您会收到错误 Facebook服务器无法完成此访问请求:remote_app_id不符合存储ID



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



2。首次安装Facebook应用程序

首次通过iOS上的本地Facebook集成(以及Mac OS X)安装应用程序时,您只需要获得基本的读取权限!在这里允许的任何其他的电子邮件 user_birthday user_location 。使用 user_about_me ,这也是根据Facebook文档的基本读取权限,不起作用。如果您以前使用Facebook JavaScript SDK或Facebook PHP SDK,这是非常令人困惑的,因为它默认要求基本权限,而无需执行某些操作。 Facebook还通过如何使用新的iOS 6上的Facebook SDK



3。请求其他权限

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



由于Facebook并没有真正区分权限参考,您必须自己识别写权限。他们通常以管理_ * 发布_ * 创建_ * 或后缀为 * _管理



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



4。示例代码

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

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

//起初,我们只要求基本的读取权限
NSArray * permissions = @ [@email];

NSMutableDictionary * dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@我的应用程序ID在这里,ACFacebookAppIdKey,权限,ACFacebookPermissionsKey,ACFacebookAudienceOnlyMe,ACFacebookAudienceKey,nil];

[self.accountStore requestAccessToAccountsWithType:facebookAccountType选项:dict完成:^(BOOL授予,NSError *错误){
if(approved&& error == nil){
/ **
*用户授予我们基本的读取权限。
*现在我们可以要求更多的权限
** /
NSArray * readPermissions = @ [@read_stream,@read_friendlists];
[dict setObject:readPermissions forKey:ACFacebookPermissionsKey];

[self.accountStore requestAccessToAccountsWithType:facebookAccountType选项:dict完成:^(BOOL授予,NSError *错误){
if(approved&& error == nil){
/ **
*我们现在应该有一些读取权限
*现在我们可以要求写入权限或
*执行其他操作。
** /
} else {
NSLog(@error is:%@,[error description]);
}
}];
} else {
NSLog(@error is:%@,[error description]);
}
}];


I'm trying to perform a simple posting procedure:

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

EDITED: The problem is that when I click on alertView's OK button (don't allow doesn't work either) nothing happens! - This behavoir now changed with this iOS 6 Facebook posting procedure ends up with "remote_app_id does not match stored id" So instead of just "nothing happens" I've got an error "The Facebook server could not fulfill this access request: remote_app_id does not match stored id"

So , it seems that alert view's click handler doing nothing, my completionHandler is never called. I do have the similar problem already: iOS 6 Social integration - go to settings issue And I think that it is the same problem here. What do you guys think about it? P.S. I'm running on MAC mini, OS X 10.8.1 with latest xcode 4.5 (4G182) and using iPhone 6.0 simulator.

ADDED: By the Bjorn's request adding the postToFeed method although it is never called:

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

解决方案

I also experienced some difficulties when working with the Accounts Framework and the Facebook integration. Here is what I've learned and how I got it working.

1. Make sure you've setup your App on Facebook correctly
You need to set how your App integrates with Facebook to Native iOS App and enter the Bundle ID of your App into the designated field. (Edit: Note that bundle IDs are case sensitive) You can set the iTunes ID to 0 for now. Enable Facebook Login and set the App Type in the advanced settings tab to Native/Desktop.
Also set App Secret in Client to No.

If one or more of these options are not set correctly it's very likely you get the error The Facebook server could not fulfill this access request: remote_app_id does not match stored id.

(Edit: You also have to ensure the sandbox is disabled.)

2. Installing the Facebook App for the first time
When first installing an App via the native Facebook integration on iOS (and Mac OS X too), you must ask for a basic read permission only! Nothing else as email, user_birthday and user_location is allowed here. Using user_about_me, which is also a basic read permission according to the Facebook documentation, does not work. This is pretty confusing if you previously worked with the Facebook JavaScript SDK or the Facebook PHP SDK, because it asks for the basic permissions by default without you having to do something. Facebook also updated their documentation with a short step-by-step guide on how to use the new Facebook SDK on iOS 6.

3. Requesting additional permissions
It's important to know, that you may not ask for read and write permissions at the same time. That's also something experienced Facebook SDK developers may find confusing. Requesting the read_stream permission along with the publish_stream permission will make the request fail, resulting in the error An app may not aks for read and write permissions at the same time.

As Facebook does not really distinguish between read/write permissions in the Permission Reference, you must identify write permissions by yourself. They're usually prefixed with manage_*, publish_*, create_* or suffixed by *_management.

Facebook does also not recommend to ask for additional permissions immediately after getting basic permissions. The documentation says "You are now required to request read and publish permission separately (and in that order). Most likely, you will request the read permissions for personalization when the app starts and the user first logs in. Later, if appropriate, your app can request publish permissions when it intends to post data to Facebook. [...] Asking for the two types separately also greatly improves the chances that users will grant the publish permissions, since your app will only seek them at the time it needs them, most likely when the user has a stronger intent.".

4. Sample Code
The following sample code should work on iOS and 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]);
    }
}];

这篇关于iOS 6 Facebook发布过程结束于“remote_app_id与存储的id不匹配”错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆