2012-07-18 11 views
6

iPhoneアプリケーションの壁にFacebookポスティングを実装することに問題があります。 SDKとリンクされたフレームワークをインストールしました ログインが正常に動作しています。コードは次のとおりです。iPhoneアプリの壁にsdkポスト

-(IBAction)loginButtonPressed:(id)sender 
{ 
    NSLog(@"loginButtonPressed: called"); 

    AppDelegate *appdel=[[UIApplication sharedApplication] delegate]; 
    appdel.facebookSession=[[FBSession alloc] init]; 
    [appdel.facebookSession openWithCompletionHandler:^(FBSession *session, 
                FBSessionState status, 
                NSError *error) 
    { 
     // 
    }]; 
} 

しかし、ユーザーの壁にメッセージを投稿する際に問題があります。コードは次のとおりです。

-(IBAction)likeButtonPressed:(id)sender 
{ 
    NSLog(@"likeButtonPressed: called"); 
    // Post a status update to the user's feedm via the Graph API, and display an alert view 
    // with the results or an error. 

    NSString *message = @"test message"; 
    NSDictionary *params = [NSDictionary dictionaryWithObject:message forKey:@"message"]; 

    // use the "startWith" helper static on FBRequest to both create and start a request, with 
    // a specified completion handler. 
    [FBRequest startWithGraphPath:@"me/feed" 
         parameters:params 
         HTTPMethod:@"POST" 
       completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 

        [self showAlert:message result:result error:error]; 
       }]; 

} 

お願いします。私のコードに何が問題なのですか?または、ログイン要求にいくつかの権限を追加する必要がありますか?

+2

。 – CBroe

+1

Facebookの投稿を開始するときにログインフォームが表示されますか? –

+2

私はデバッグ中に「エラー:HTTPステータスコード:400」と「操作を完了できませんでした。 (com.facebook.FBIOSSDKエラー5) 'ÍIAlertView'で – user1385666

答えて

9

このコードを試してみてください。 まずしなければならない

#import <FBiOSSDK/FacebookSDK.h> 

その後、

@property (strong, nonatomic) FBRequestConnection *requestConnection; 

そしてもちろんを合成することを忘れないでください:

@synthesize requestConnection; 

コード自体:

-(IBAction)likeButtonPressed:(id)sender 
{ 
    NSLog(@"likeButtonPressed: called"); 
    // FBSample logic 
    // Check to see whether we have already opened a session. 
    if (FBSession.activeSession.isOpen) 
    { 
     // login is integrated with the send button -- so if open, we send 
     [self postOnWall]; 
    } 
    else 
    { 
     [FBSession sessionOpenWithPermissions:[NSArray arrayWithObjects:@"publish_stream", nil] 
           completionHandler: 
      ^(FBSession *session, 
       FBSessionState status, 
       NSError *error) 
      { 
       // if login fails for any reason, we alert 
       if (error) 
       { 
        NSLog(@" login failed"); 
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                    message:error.localizedDescription 
                    delegate:nil 
                  cancelButtonTitle:@"OK" 
                  otherButtonTitles:nil]; 
        [alert show]; 
        // if otherwise we check to see if the session is open, an alternative to 
        // to the FB_ISSESSIONOPENWITHSTATE helper-macro would be to check the isOpen 
        // property of the session object; the macros are useful, however, for more 
        // detailed state checking for FBSession objects 
       } 
       else if (FB_ISSESSIONOPENWITHSTATE(status)) 
       { 
        NSLog(@" sending post on wall request..."); 
        // send our requests if we successfully logged in 
        [self postOnWall]; 
       } 
      }]; 
    }; 
} 

- (void)postOnWall 
{ 
    NSNumber *testMessageIndex=[[NSNumber alloc] init]; 
    if ([[NSUserDefaults standardUserDefaults] objectForKey:@"testMessageIndex"]==nil) 
    { 
     testMessageIndex=[NSNumber numberWithInt:100]; 
    } 
    else 
    { 
     testMessageIndex=[[NSUserDefaults standardUserDefaults] objectForKey:@"testMessageIndex"]; 
    }; 
    testMessageIndex=[NSNumber numberWithInt:[testMessageIndex intValue]+1]; 
    [[NSUserDefaults standardUserDefaults] setObject:testMessageIndex forKey:@"testMessageIndex"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

    // create the connection object 
    FBRequestConnection *newConnection = [[FBRequestConnection alloc] init]; 

    // create a handler block to handle the results of the request for fbid's profile 
    FBRequestHandler handler = 
    ^(FBRequestConnection *connection, id result, NSError *error) { 
     // output the results of the request 
     [self requestCompleted:connection forFbID:@"me" result:result error:error]; 
    }; 

    // create the request object, using the fbid as the graph path 
    // as an alternative the request* static methods of the FBRequest class could 
    // be used to fetch common requests, such as /me and /me/friends 
    NSString *messageString=[NSString stringWithFormat:@"wk test message %i", [testMessageIndex intValue]]; 
    FBRequest *request=[[FBRequest alloc] initWithSession:FBSession.activeSession graphPath:@"me/feed" parameters:[NSDictionary dictionaryWithObject:messageString forKey:@"message"] HTTPMethod:@"POST"]; 

    // add the request to the connection object, if more than one request is added 
    // the connection object will compose the requests as a batch request; whether or 
    // not the request is a batch or a singleton, the handler behavior is the same, 
    // allowing the application to be dynamic in regards to whether a single or multiple 
    // requests are occuring 
    [newConnection addRequest:request completionHandler:handler]; 

    // if there's an outstanding connection, just cancel 
    [self.requestConnection cancel]; 

    // keep track of our connection, and start it 
    self.requestConnection = newConnection;  
    [newConnection start]; 
} 

// FBSample logic 
// Report any results. Invoked once for each request we make. 
- (void)requestCompleted:(FBRequestConnection *)connection 
       forFbID:fbID 
        result:(id)result 
        error:(NSError *)error 
{ 
    NSLog(@"request completed"); 

    // not the completion we were looking for... 
    if (self.requestConnection && 
     connection != self.requestConnection) 
    { 
     NSLog(@" not the completion we are looking for"); 
     return; 
    } 

    // clean this up, for posterity 
    self.requestConnection = nil; 

    if (error) 
    { 
     NSLog(@" error"); 
     UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"error" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
     // error contains details about why the request failed 
     [alert show]; 
    } 
    else 
    { 
     NSLog(@" ok");   
    }; 
} 
+1

これは期待された答えです.FBRequestConnectionはFBDialogのようなUIを提供していません。ですから、FaceBookFrameworkでそれを処理したい場合は、代わりになるべきものがあります。 – andyPaul

+1

私のために働かなかった –

+0

@Mobilhunterz:あなたのコードを私たちと共有できますか?これは最初の実行のために私のために働いた。あなたは何かが欠けているかもしれません。コードスニペットを私たちと共有して、より良いお手伝いをすることができます。 – Ans

3

は、このコードは私のために働いた

 NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
NSArray* facebookCookies = [cookies cookiesForURL: 
          [NSURL URLWithString:@"http://login.facebook.com"]]; 

for (NSHTTPCookie* cookie in facebookCookies) { 
    [cookies deleteCookie:cookie]; 
} 
NSString *FBBody = [NSString stringWithFormat:@"your message you want to post"]; 
UIImage *img=[UIImage imageNamed:[NSString stringWithFormat:image naemif you want to post]]; 
FBFeedPost *post = [[FBFeedPost alloc] initWithPhoto:img name:FBBody]; 
[post publishPostWithDelegate:self]; 
[[UIAppDelegate indicator] startAnimating]; 
IFNNotificationDisplay *display = [[IFNNotificationDisplay alloc] init]; 
display.type = NotificationDisplayTypeLoading; 
display.tag = NOTIFICATION_DISPLAY_TAG; 
2

あなたがアクセス権を設定する必要があります:"状態_更新"。

このような

:あなたは、実際の_problem/ERROR_を記述するのを忘れ

FBLoginView *loginview = [[FBLoginView alloc] initWithPermissions:[NSArray arrayWithObject:@"status_update"]]; 

または

FBSession *fbSession = [[FBSession alloc] initWithPermissions:[NSArray arrayWithObject:@"status_update"]]; 
関連する問題