如何在没有用户修改消息的情况下从 iOS 应用程序发布到 Facebook 墙
Posted
技术标签:
【中文标题】如何在没有用户修改消息的情况下从 iOS 应用程序发布到 Facebook 墙【英文标题】:How to publish from iOS application to facebook wall without user amending message 【发布时间】:2011-03-21 12:29:26 【问题描述】:我正在编写一个 iPhone 游戏,并希望将用户的分数发布到他们的 Facebook 订阅源。
我设法拼凑了一个示例,其中用户同意授权,然后出现一个对话框,他们可以确认在他们的墙上发布或不发布。这几乎是理想的,除了文本是可编辑的字段 - 因此用户可以修改他们的分数然后发布。理想情况下,我想要完全相同的机制,但无法修改消息。
我假设要这样做,我需要询问 publish_stream 权限,然后调用 Graph api 来发布消息。我找到了这个,但得到一个错误“必须使用活动访问令牌来查询有关当前用户的信息。”。
我很乐意就实际代码更改指出正确的方向 - 非常感谢任何帮助。
这是我在 *** 上的第一篇文章,所以请温柔一点。
谢谢大家。
-邓肯
原始代码(发布到墙上但带有可修改的文本框)
//offer to facebook connect your score
facebook = [[Facebook alloc] initWithAppId:@"210645928948875"];
[facebook authorize:nil delegate:self];
NSMutableString *facebookMessage = [NSMutableString stringWithString:@"I scored a whopping "];
[facebookMessage appendString: [NSMutableString stringWithFormat:@"%d", currentScore]];
[facebookMessage appendString: [NSMutableString stringWithString:@". Can you beat me?"]];
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"210645928948875", @"app_id",
@"http://duncan.co.uk/", @"link",
@"http://d.yimg.com/gg/goran_anicic/dunc.jpeg", @"picture",
@"dunc", @"name",
//@"Reference Documentation", @"caption",
@"Download the app NOW from the App Store", @"description",
facebookMessage, @"message",
nil];
[facebook dialog:@"stream.publish" andParams:params andDelegate:self];
直接发布到墙上的代码(未证明)(会引发活动令牌错误):
/*Facebook Application ID*/
NSString *client_id = @"210645928948875";
//alloc and initalize our FbGraph instance
self.fbGraph = [[FbGraph alloc] initWithFbClientID:client_id];
//begin the authentication process..... andExtendedPermissions:@"user_photos,user_videos,publish_stream,offline_access"
[fbGraph authenticateUserWithCallbackObject:self andSelector:@selector(fbGraphCallback:) andExtendedPermissions:@"user_photos,user_videos,publish_stream,offline_access"];
NSMutableDictionary *variables = [NSMutableDictionary dictionaryWithCapacity:4];
[variables setObject:@"the message" forKey:@"message"];
[variables setObject:@"http://duncan.co.uk" forKey:@"link"];
[variables setObject:@"bold copy next to image" forKey:@"name"];
[variables setObject:@"plain text score." forKey:@"description"];
FbGraphResponse *fb_graph_response = [fbGraph doGraphpost:@"me/feed" withPostVars:variables];
NSLog(@"postMeFeedButtonPressed: %@", fb_graph_response.htmlResponse);
【问题讨论】:
您应该知道,预填充 message 参数最终会导致您的应用因违反政策而被 Facebook 禁止,而且通常没有任何警告。 message 参数必须是用户生成的。见 IV.2developers.facebook.com/policy 【参考方案1】:找到解决方案。应首先调用身份验证。一旦通过身份验证,这将调用 fbGraphCallback 函数,该函数将执行用户流的发布。
所有这一切都得益于http://www.capturetheconversation.com/technology/iphone-facebook-oauth2-graph-api。奖励积分归疯狂玩家所有。非常感谢。
-(IBAction)buttonPublishOnFacebookPressed:(id)sender
/*Facebook Application ID*/
NSString *client_id = @"123456789012345";
//alloc and initalize our FbGraph instance
self.fbGraph = [[FbGraph alloc] initWithFbClientID:client_id];
//begin the authentication process.....
[fbGraph authenticateUserWithCallbackObject:self andSelector:@selector(fbGraphCallback:)
andExtendedPermissions:@"publish_stream" andSuperView:self.view];
-(void)fbGraphCallback:(id)sender
if ((fbGraph.accessToken == nil) || ([fbGraph.accessToken length] == 0))
NSLog(@"You pressed the 'cancel' or 'Dont Allow' button, you are NOT logged into Facebook...I require you to be logged in & approve access before you can do anything useful....");
else
NSLog(@"------------>CONGRATULATIONS<------------, You're logged into Facebook... Your oAuth token is: %@", fbGraph.accessToken);
NSMutableDictionary *variables = [NSMutableDictionary dictionaryWithCapacity:4];
[variables setObject:@"http://farm6.static.flickr.com/5015/5570946750_a486e741.jpg" forKey:@"link"];
[variables setObject:@"http://farm6.static.flickr.com/5015/5570946750_a486e741.jpg" forKey:@"picture"];
[variables setObject:@"You scored 99999" forKey:@"name"];
[variables setObject:@" " forKey:@"caption"];
[variables setObject:@"Download my app for the iPhone NOW." forKey:@"description"];
FbGraphResponse *fb_graph_response = [fbGraph doGraphPost:@"me/feed" withPostVars:variables];
NSLog(@"postMeFeedButtonPressed: %@", fb_graph_response.htmlResponse);
//parse our json
SBJSON *parser = [[SBJSON alloc] init];
NSDictionary *facebook_response = [parser objectWithString:fb_graph_response.htmlResponse error:nil];
[parser release];
NSLog(@"Now log into Facebook and look at your profile...");
[fbGraph release];
【讨论】:
我可以传递本地图片作为链接和图片选项吗?如果是,怎么做? 无本地链接,该 URL 需要可从 Internet 访问。【参考方案2】:看起来您的权限是逗号分隔的 NSString,而不是 NSArray。 FB authorize:
需要一个 NSArray,而不是 NSString。
您是否正在等待调用 fbGraphCallback
的身份验证的响应(该代码是否解释过?)我猜您的回调会显示身份验证失败,因为您的权限无效。您必须等待身份验证完成 - 否则您可能没有身份验证令牌才能继续。
FWIW - FB 可能已经更改了他们在该应用中的规则,如果不让用户修改帖子文本,则不应将其发布到流中。更好的方法可能是使用您的原始代码片段(如果这是问题,则等待身份验证?)。您可以在帖子参数中放置游戏链接,然后将分数放入标题或描述参数(非编辑字段)中。然后,您可以使用 FB 对话框,而不是让人们更改分数。
【讨论】:
我提到了authorize
: 方法你似乎有一个旧版本的SDK
非常感谢疯狂的玩家!我昨天找到了解决方案,现在将发布它,但你几乎走在正确的轨道上 - fbGraphCallback 行下的代码应该在 fbGraphCallback 函数中。
此外,当列为逗号分隔的字符串时,权限工作正常。那里没问题。非常感谢您的帮助。真的很感激。【参考方案3】:
您可以使用图形 API。
[_facebook requestWithMethodName:@"stream.publish"
andParams:params
andHttpMethod:@"POST"
andDelegate:nil];
【讨论】:
这看起来不像图形 API。以上是关于如何在没有用户修改消息的情况下从 iOS 应用程序发布到 Facebook 墙的主要内容,如果未能解决你的问题,请参考以下文章
iOS:在没有 UITabBarController 的情况下从用户界面实现 UITabBar
在没有 facebook 应用程序的情况下从 iOS 应用程序在 facebook 上共享照片
客户端如何在没有频繁 ajax 请求的情况下从服务器获取更新?