Обработка SLRequest Ошибка 2500 Facebook

Существуют две основные вещи, которые могут вызвать проблемы при использовании SLRequest для создания постов в Facebook: 1. Пользователь удаляет разрешения для приложения в Facebook. Это приводит к ошибке 2500, что означает, что вам необходимо переустановить приложение и снова получить разрешения. 2. Срок действия токена истек. Все, что вам нужно сделать здесь, это обновить учетные данные.

Моя проблема в основном с первым. Мне удалось обработать обновленные учетные данные, но я сталкиваюсь с большими трудностями при попытке "возобновить время" (как мне нравится это называть) или переустановить приложение и снова получить разрешения.

Вот макет моего кода публикации в Facebook (см. Комментарии для объяснения того, почему я так делаю):

Во-первых, пользователь должен переключиться на общий доступ к Facebook в контроллере просмотра настроек:

-(void)facebookpost {
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];

       ACAccountType * facebookAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSArray *accounts = [accountStore accountsWithAccountType:facebookAccountType];

  //why two permissions and dictionaries?  Well, before you can post to Facebook, you have to get basic read permissions, such as email.  If you attempt to obtain both of these permissions, you will fail.  So, the app tries for permission of email first, if it succeeds, it tries for permission for publish_stream.  
    NSArray * permissions = @[@"email"];
    NSArray * permissions2 = @[@"publish_stream"];

    NSDictionary * dict = @{ACFacebookAppIdKey : @"289006474446717", ACFacebookPermissionsKey : permissions, ACFacebookAudienceKey : ACFacebookAudienceFriends};
    NSDictionary * dict2 = @{ACFacebookAppIdKey : @"289006474446717", ACFacebookPermissionsKey : permissions2, ACFacebookAudienceKey : ACFacebookAudienceFriends};
    [accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
        if (granted && error == nil) {
//the following defaults just sets a key value which will be checked to see if the app should try and post anything
            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"facebook"];
            [[NSUserDefaults standardUserDefaults] synchronize];
           //nothing gets posted yet, onto try for permissions to post

            [accountStore requestAccessToAccountsWithType:facebookAccountType options:dict2 completion:^(BOOL granted, NSError *error) {
                if(granted && error == nil) {

                  //good, it is now granted permission for both reading and writing
                } else {
                    NSLog(@"1error is: %@",[error description]);
                }
            }];
        } else {

            NSLog(@"error is: %@",error );

            if(error.code == 6){
//this is the error message that will appear if the user has not signed into Facebook from Settings app.  alertmessage simply pops up an alert instructing them to please do so.
                [self performSelectorOnMainThread:@selector(alertmessage)
                                       withObject:nil
                                    waitUntilDone:YES];                }
        }
    }];

}

Теперь мы находимся на почтовый индекс. Этот код находится в подробном контроллере табличного представления. В табличном представлении перечислены статьи, щелкнув одну из которых, вы увидите ее в подробном представлении с помощью веб-представления. В viewWillAppear приложение проверяет значение bool клавиши "facebook". Если это НЕТ, это не делает ничего, кроме показа статьи. Если это ДА, он пытается опубликовать сообщение на стене (еще раз см. Комментарии для объяснений):

-(void)writetowall {
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];

    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSArray *accounts = [accountStore accountsWithAccountType:accountType];

    ACAccount *account = [accounts lastObject];

      NSDictionary *parameters = @{@"message" : [NSString stringWithFormat:@"I'm reading %@ from the blog.  Click the link to read it too.", _entry.articleTitle], @"link": _entry.articleUrl};
    NSURL *URL = [NSURL URLWithString:@"https://graph.facebook.com/me/feed"];

    SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                            requestMethod:SLRequestMethodPOST
                                                      URL:URL
                                               parameters:parameters];


    [request setAccount:account];

    [request performRequestWithHandler:^(NSData *responseData,
                                             NSHTTPURLResponse *urlResponse, NSError *error) {
        NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData
                                                                           options:kNilOptions
                                                                            error:&error];
        NSDictionary *errorDictionary = [responseDictionary valueForKey:@"error"];

        if (errorDictionary) {

            NSNumber *errorCode = [errorDictionary valueForKey:@"code"];
            if ([errorCode isEqualToNumber:[NSNumber numberWithInt:190]]) {
//190 is code that you need to renew credentials.  this is when tokens expire.  so, if it happens, it goes to renew code (not included in this question as it is working fine)
            NSLog(@"Renew");
                [self renew];
            }
            if ([errorCode isEqualToNumber:[NSNumber numberWithInt:2500]]) {
//here is the 2500 code meaning the app has not been installed yet, or needs to be installed again with new permissions.  so, I have it run the method renewbigtime which I will now list below
                [self renewbigtime];
            }
        }
    }];
}

Итак, пользователь заходит в Facebook AppCenter, нажимает X рядом с приложением, и теперь, когда они пытаются опубликовать, он выдает им код ошибки 2500, поэтому он вызывает этот метод, который очень похож на первоначальный метод для предоставления начального разрешения:

-(void)renewbigtime {
    ACAccountStore *accountStore = [[ACAccountStore alloc] init];

    ACAccountType * facebookAccountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSArray *accounts = [accountStore accountsWithAccountType:facebookAccountType];

    NSArray * permissions = @[@"email"];
    NSArray * permissions2 = @[@"publish_stream"];

    NSDictionary * dict = @{ACFacebookAppIdKey : @"289006474446717", ACFacebookPermissionsKey : permissions, ACFacebookAudienceKey : ACFacebookAudienceFriends};
    NSDictionary * dict2 = @{ACFacebookAppIdKey : @"289006474446717", ACFacebookPermissionsKey : permissions2, ACFacebookAudienceKey : ACFacebookAudienceFriends};
    [accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
        if (granted && error == nil) {
            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"facebook"];
            [[NSUserDefaults standardUserDefaults] synchronize];


            [accountStore requestAccessToAccountsWithType:facebookAccountType options:dict2 completion:^(BOOL granted, NSError *error) {
                if(granted && error == nil) {
                    //here is where it should be granted and no errors for anything, so we redirect to writetowall method which should simply post to the wall
                    [self writetowall];
                } else {
                    NSLog(@"1error is: %@",[error description]);
                }
            }];
        } else {

            NSLog(@"error is: %@",error );

            if([[error description] isEqualToString:@"Error Domain=com.apple.accounts Code=6 \"The operation couldn’t be completed. (com.apple.accounts error 6.)\""]){
                [self performSelectorOnMainThread:@selector(alertmessage)
                                       withObject:nil
                                    waitUntilDone:YES];                }
        }
    }];

}

Проблема в том, что приложение застревает в цикле на этом этапе. Если он получает ошибку 2500, он пытается обновить учетные данные, но продолжает работать с ошибкой 2500, попытаться обновить 2500, попытаться обновить. Никакие другие сообщения об ошибках не появляются в разделе renewbigtime, так что я делаю не так?

0 ответов

Другие вопросы по тегам