2012-07-18 79 views
6

我的iPhone应用程序在墙上发布Facebook发布时遇到问题。我安装了SDK和链接框架 登录工作正常。这里是代码:在iPhone应用程序墙上的Facebook 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

你忘了描述实际_problem /错误_。 – CBroe 2012-07-18 11:36:04

+1

当你启动你的Facebook发布时,是否显示登录表单? – 2012-07-18 11:36:05

+2

我在调试中收到一条消息:'错误:HTTP状态码:400'和'操作无法完成。 (com.facebook.FBIOSSDK错误5.)'in'IAlertView' – user1385666 2012-07-18 11:36:14

回答

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不提供任何UI,如FBDialog。所以,如果我们想FaceBookFramework来处理它,那么它应该是什么选择。 – andyPaul 2012-09-23 03:13:21

+1

没有为我工作 – 2012-09-26 09:38:17

+0

@Mobilhunterz:你可以与我们分享你的代码吗?这对我来说是第一次运行。可能是你错过了一些东西。与我们分享您的代码片段,以便我们可以更好地为您提供帮助。 – Ans 2013-08-16 15:07:48

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

你应该设置权限:“状态_更新”。

这样的:

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

FBSession *fbSession = [[FBSession alloc] initWithPermissions:[NSArray arrayWithObject:@"status_update"]]; 
相关问题