Facebook - ios integration (Social Framework) Invalid permission

I'm working on two different iOS apps:

  • both of them sharing content with Facebook.
  • both of them with iOS 6/7.
  • both of them with Social Framework
  • in both of them I'm having problems sharing with Facebook.

So I'm doing anything wrong despite I've tried to follow all kind of posts, docs, and so on.

I've specially followed this post iOS 6 Facebook posting procedure ends up with "remote_app_id does not match stored id" error, it has a very good answer.

I think I have created my apps in Facebook Developers ok because I had problems (wrong iPhone ID and error 7) and following the post I've mentioned these problems dissapeared.

When a user clicks on share on facebook I do this:

- (void) loginWithFacebookWithReadPermissionsWithDelegate:(id<IfcRRSSDelegate>)_delegate
{
    self.delegateFB = _delegate;

    ACAccountStore *account = [[ACAccountStore alloc]init];
    ACAccountType *accountType = [cuenta accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSString *facebookKey = MY_FACEBOOK_KEY;
    NSMutableArray *permimssions = [[NSMutableArray alloc] init];
    [permimssions addObject:@"email"];

    self.fbPermission = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
                            facebookKey, ACFacebookAppIdKey,
                            ACFacebookAudienceFriends, ACFacebookAudienceKey,
                            permimssions, ACFacebookPermissionsKey, 
                            nil];

    [account requestAccessToAccountsWithType:accountType options:self.fbPermission completion:
     ^(BOOL granted, NSError *error) {
         if(granted)
         {
             NSArray *accounts = [account accountsWithAccountType: accountType];
             ACAccount *_facebookAccount = [accounts lastObject];
             self.accountFB = _facebookAccount;
             ACAccountCredential *credentials = [self.accountFB credential];
             self.tokenFB = [credentials oauthToken];
         }
         else
         {
            // Show error 
         }
     }];
}

If this login goes well (in fact it always goes well) I call this:

- (void) loginWithFacebookWithWritePermissionsWithDelegate:(id<IfcRRSSDelegate>)_delegate
{
    self.delegateFB = _delegate;

    ACAccountStore *account = [[ACAccountStore alloc]init];
    ACAccountType *accountType = [cuenta accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSString *facebookKey = MY_FACEBOOK_KEY;
    NSMutableArray *permimssions = [[NSMutableArray alloc] init];
    [permimssions addObject:@"publish_stream"];
    [permimssions addObject:@"publish_actions"];

    self.fbPermission = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
                            facebookKey, ACFacebookAppIdKey,
                            ACFacebookAudienceFriends, ACFacebookAudienceKey,
                            permimssions, ACFacebookPermissionsKey, 
                            nil];

    [account requestAccessToAccountsWithType:accountType options:self.fbPermission completion:
     ^(BOOL granted, NSError *error) {
         NSLog(@">>>>ERROR: %@", error);
         if(granted)
         {
             NSArray *accounts = [account accountsWithAccountType: accountType];
             ACAccount *_facebookAccount = [accounts lastObject];
             self.accountFB = _facebookAccount;
             ACAccountCredential *credentials = [self.accountFB credential];
             self.tokenFB = [credentials oauthToken];
         }
         else
         {
            // Show error 
         }
     }];
}

This second login FAILS, I get this error:

ERROR: Error Domain=com.apple.accounts Code=7 "The Facebook server could not fulfill this access request: Invalid permission: publish_stream" UserInfo=0xc18d700 {NSLocalizedDescription=The Facebook server could not fulfill this access request: Invalid permission: publish_stream}

Invalid permission: publish_stream??? I can hardly find information about this error.

I've tried to comment this permission and have only publish_action, but when I try to post I get this new error:

{
    code = 200;
    message = "(#200) The user hasn't authorized the application to perform this action";
    type = OAuthException;
}

If this second login went well I would call this code to post (but it's never called because the second login fails):

- (void) postWithFacebookWithMessage:(NSString *)msg
{
    if(self.accountFB)
    {
        NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
        [parameters setObject: self.accountFB.credential.oauthToken forKey:@"access_token"];
        [parameters setObject:msg forKey:@"message"];

        NSURL *requestUR = [NSURL URLWithString:@"https://graph.facebook.com/me/feed"];

        SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                                requestMethod:SLRequestMethodPOST
                                                          URL:requestURL
                                                   parameters:parameters];
        request.account = self.accountFB;
        [request performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *response, NSError *error) {
            if(!error)
            {
                NSDictionary *list = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
                if([list objectForKey:@"error"] != nil)
                {
                    // Try to attempt Renew Credentials
                }
                else
                {
                    // Everything works
                }
                dispatch_async(dispatch_get_main_queue(),^{});
            }
            else
            {
                    // Try to attempt Renew Credentials
            }
        }];
    }
}

If this is important, I've checked in my facebook page, in my activity, apps, this app and it sais "This app can publish in your name for: Only you".

Any idea of what is it happening?

Kind regards!

EDIT: Sorry, I made an important mistake explaining the error so I edited the post: the facebook call that fails is the second login, not the post.

Answers


Try this code, which I using in my app:

__block ACAccount * facebookAccount;
        ACAccountStore *accountStore = [[ACAccountStore alloc] init];

    NSDictionary *emailReadPermisson = @{
                                         ACFacebookAppIdKey : @"0123456789",
                                         ACFacebookPermissionsKey : @[@"email"],
                                         ACFacebookAudienceKey : ACFacebookAudienceEveryone,
                                         };

    NSDictionary *publishWritePermisson = @{
                                            ACFacebookAppIdKey : @"0123456789",
                                            ACFacebookPermissionsKey : @[@"publish_actions"],
                                            ACFacebookAudienceKey : ACFacebookAudienceEveryone
                                            };

    ACAccountType *facebookAccountType = [accountStore
                                          accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    //Request for Read permission

    [accountStore requestAccessToAccountsWithType:facebookAccountType options:emailReadPermisson completion:^(BOOL granted, NSError *error) {

        if (granted) {

            NSLog(@"Granted for read");

            //Request for write permission
            [accountStore requestAccessToAccountsWithType:facebookAccountType options:publishWritePermisson completion:^(BOOL granted, NSError *error) {

                if (granted) {

                    NSLog(@"Granded for post");

                    NSArray *accounts = [accountStore
                                         accountsWithAccountType:facebookAccountType];
                    facebookAccount = [accounts lastObject];
                    NSLog(@"Successfull access for account: %@", facebookAccount.username);
                    /* Do any things here */
                }
                else
                {
                    NSLog(@"Access to Facebook is not granted");

                    // Fail gracefully...
                    NSLog(@"%@",error.description);
                }
            }];
        }else{
             /* Error */
        }
    }];

This sample was found in this post

And if you're getting 'not granted' state of your account - check does your app not blocked in Settings->Facebook. If it is - ask user to give access from settings.


Need Your Help

Efficient algorithm for finding the in-order rank of a binary tree node

java algorithm data-structures tree binary-tree

Given a binary tree (not necessarily a binary search tree) and a node in that tree, What is an efficient algorithm (in Java preferably) to find the in-order rank of that node?

Not able to create table and columns in SQLite Database

android mysql database sqlite table

I Created Database for my application and produced code for table creation. It produce the error as follows. Help me asap! Thank you!

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.