0

FacebookSDKに設定されているチュートリアルに従っています。

iOSSDKを使用してFacebookでログインします

フィードに公開

アプリをテストする場合を除いて、すべて正常に機能しているようです。Facebookのウォールに投稿しようとすると、最初にHTTPエラー400(またはエラーコード5)が発生します。アプリでもう一度[投稿]ボタンを押すと、2回目はすべてが機能しているようです。最初の試行では、ユーザーは認証のためにFacebookアプリに送られ、アプリに戻ってからHTTP 400を受け取ります。2回目の試行では、アプリの切り替えはなく、メッセージは期待どおりにFacebookのウォールに投稿されます。 。

私のアプリが最初の試行でウォール/タイムラインに投稿されない理由を理解しようとしています。私のコードはチュートリアルのコードと同じです。

編集:

言及するのを忘れて、私は認証と壁への投稿の両方に1つのボタンを使用しています-これはIBActionのコードです:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    // The user has initiated a login, so call the openSession method
    // and show the login UX if necessary.
    [appDelegate openSessionWithAllowLoginUI:YES];


    [FBRequestConnection startWithGraphPath:@"me/feed" parameters:postParams HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection,id result,NSError *error)
    {

        NSString *alertText;

        if (error) {
             alertText = [NSString stringWithFormat:
                          @"error: domain = %@, code = %d", error.domain, error.code];
         } else {
             /*alertText = [NSString stringWithFormat:
                          @"Posted action, id: %@", [result objectForKey:@"id"]];*/
             alertText = @"Posted!";
         }
         // Show the result in an alert
        [[[UIAlertView alloc] initWithTitle:@"Facebook" message:alertText delegate:self cancelButtonTitle:@"OK!" otherButtonTitles:nil] show];
    }];
4

1 に答える 1

1

私はmkralの役立つコメントでこれを解決しました-コードは次のように変更されました:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    if (FBSession.activeSession.isOpen) { //session is open so can post right away

        [FBRequestConnection startWithGraphPath:@"me/feed" parameters:postParams HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection,id result,NSError *error)
         {

             NSString *alertText;

             if (error) {
                 alertText = [NSString stringWithFormat:
                              @"error: domain = %@, code = %d", error.domain, error.code];
             } else {
                 alertText = @"Posted!";
             }
             // Show the result in an alert
             [[[UIAlertView alloc] initWithTitle:@"Facebook" message:alertText delegate:self cancelButtonTitle:@"OK!" otherButtonTitles:nil] show];
         }];

    }
    else //session isn't open so authenticate first, then can post when back to app through notification
    {
        NSLog(@"Facebook Active Session not open");
        // The user has initiated a login, so call the openSession method
        // and show the login UX if necessary.
        [appDelegate openSessionWithAllowLoginUI:YES];
    }

そこで、最初にアクティブなセッションがあるかどうかを確認します。アクティブなセッションがある場合は、ウォール/タイムラインに投稿できます。ない場合は、セッションを開きます。次に、(viewDidLoadで)通知に登録して、セッションが変更されたかどうか(この場合はセッションが開かれた場合)を通知し、認証されるとウォールに投稿します。

- (void)viewDidLoad
{
    [super viewDidLoad];        

//register for the session change notification you defined in the app delegate (for example when session changes to logged in)
    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(sessionStateChanged:)
     name:FBSessionStateChangedNotification
     object:nil];

}

- (void)sessionStateChanged:(NSNotification*)notification {
    if (FBSession.activeSession.isOpen) {

        [FBRequestConnection startWithGraphPath:@"me/feed" parameters:postParams HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection,id result,NSError *error)
         {

             NSString *alertText;

             if (error) {
                 alertText = [NSString stringWithFormat:
                              @"error: domain = %@, code = %d", error.domain, error.code];
             } else {
                 alertText = @"Posted!";
             }
             // Show the result in an alert
             [[[UIAlertView alloc] initWithTitle:@"Facebook" message:alertText delegate:self cancelButtonTitle:@"OK!" otherButtonTitles:nil] show];
         }];

    }
}
于 2012-09-21T22:13:07.493 に答える