如何在没有用户修改消息的情况下从 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 请求的情况下从服务器获取更新?

如何在 identityserver4 中没有用户名和密码的情况下从令牌端点获取令牌?

如何在没有选择器的情况下从应用程序发送电子邮件? [复制]

如何在不更改代码的情况下从已编译的 jar 中检索完整的异常消息?