从 iOS 发布到 Facebook 时间线在第一次尝试时会提供 HTTP 400
Posted
技术标签:
【中文标题】从 iOS 发布到 Facebook 时间线在第一次尝试时会提供 HTTP 400【英文标题】:Posting to Facebook timeline from iOS gives HTTP 400 on first try 【发布时间】:2012-09-21 16:49:39 【问题描述】:我正在按照 facebook SDK 上的教程进行操作:
Login with facebook using the ios SDK
Publish to Feed
一切似乎都正常,除了在测试我的应用程序时,我第一次尝试在 Facebook 墙上发帖时收到 HTTP 错误 400(或错误代码 5)。如果我在应用程序中再次按下“发布”按钮,第二次,一切似乎都正常。第一次尝试,用户被发送到 facebook 应用程序进行身份验证,然后切换回应用程序,然后给我 HTTP 400。第二次尝试,没有应用程序切换,消息按预期发布到 facebook 墙上.
我试图弄清楚为什么我的应用在第一次尝试时不会发布到墙上/时间轴上。我的代码和教程里的一样。
编辑:
忘了提一下,我使用一个按钮来进行身份验证和发布到墙上 - 这是 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];
];
【问题讨论】:
在您的第一次尝试中,您是否尝试在用户通过身份验证之前发布到墙上? 我认为这可能是问题所在 - 我使用一个按钮来进行身份验证和发布 - 忘了提及这一点。 (更新了上面的帖子) 你没有按照教程开始,他们提到有一个登录/注销按钮和一个发布/分享按钮......一旦应用程序切换回来你需要更新登录/注销按钮.. . 好吧,我已经根据我的需要调整了教程 - 我使用一个按钮登录然后发布。还是需要单独登录,单独发帖? 一旦通过身份验证,我会检查是否有委托方法。这样你就只有一个按钮。单击时,检查它是否已通过身份验证,如果是,则将数据发布到 FB,如果未通过身份验证,则进行身份验证,并在通过身份验证后在委托方法中发布项目。 【参考方案1】:我用 mkral 的有用 cmets 解决了这个问题 - 代码更改如下:
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];
];
【讨论】:
以上是关于从 iOS 发布到 Facebook 时间线在第一次尝试时会提供 HTTP 400的主要内容,如果未能解决你的问题,请参考以下文章