【问题标题】:Can't post to facebook wall with iOS SDK (authorization issue)无法使用 iOS SDK 发布到 Facebook 墙(授权问题)
【发布时间】:2011-07-01 16:45:24
【问题描述】:

首先我用我的 appId 创建 facebook 对象:

facebook = [[Facebook alloc] initWithAppId:kAppId];

当我打电话时

[_facebook authorize:_permissions delegate:self] 

我的 safari 打开,在我输入我的 FB 用户名和密码后,safari 关闭,一切都返回到我的应用程序(就像它应该的那样)。 我的权限是:

_permissions =  [[NSArray arrayWithObjects:@"read_stream", @"publish_stream", @"offline_access",nil] retain];

奇怪的是,我的委托方法 - (void)fbDidLogin 或 -(void)fbDidNotLogin:(BOOL)cancelled 不像 SDK 附带的 FB 示例应用程序那样被调用。在我的 .h 文件中,我实现了协议“FBRequestDelegate, FBDialogDelegate, FBSessionDelegate" 和 .m 文件中我有必要的方法。

如果我在此之后尝试发帖

[_facebook requestWithGraphPath:@"me/feed" 
        andParams:[NSMutableDictionary dictionaryWithObject:@"test wall post" forKey:@"message"]
                  andHttpMethod:@"POST"
                    andDelegate:self];

我收到错误“req failed with error The operation could not be completed. (facebookErrDomain error 10000.)”。这一定与授权有关,但由于我在授权调用后没有收到任何消息,所以我不知道该怎么做。

有什么想法吗?

【问题讨论】:

  • 你请求了什么_permissions?
  • 我用权限更新了我的帖子。
  • 旁注:以上代码对 Facebook iOS SDK 3.x 不再有效

标签: iphone objective-c facebook


【解决方案1】:
NSMutableDictionary *params = [NSMutableDictionary  dictionaryWithObjectsAndKeys:
                      @"My new status message", @"message",
                      nil];
[_facebook requestWithGraphPath:@"/me/feed"
                  andParams:params
                  andHttpMethod:@"POST"
            andDelegate:self];

返回的错误对象包含有关正在发生的事情的详细信息。 我建议实施该方法以获取更多信息:

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
    NSLog(@"%@", [error localizedDescription]);
    NSLog(@"Err details: %@", [error description]);
};

例如,我的问题给了我该信息,我已经修复了它:

2011-05-27 11:19:57.313 Challengein[7704:207] The operation couldn’t be completed. (facebookErrDomain error 10000.)
2011-05-27 11:19:57.314 Challengein[7704:207] Err details: Error Domain=facebookErrDomain Code=10000 "The operation couldn’t be completed. (facebookErrDomain error 10000.)" UserInfo=0x6878b90 {error=<CFBasicHash 0x6879be0 [0x141c400]>{type = mutable dict, count = 2,
entries =>
    2 : <CFString 0x6877f70 [0x141c400]>{contents = "type"} = <CFString 0x686f9a0 [0x141c400]>{contents = "OAuthException"}
    3 : <CFString 0x686d610 [0x141c400]>{contents = "message"} = <CFString 0x686f970 [0x141c400]>{contents = "(#100) picture URL is not properly formatted"}
}
}

请试试这个链接 http://www.capturetheconversation.com/technology/-facebook-oauth-2-0-and-the-graph-api-a-tutorial-part-2

【讨论】:

  • 使用错误详细信息我得到这个:“必须使用活动访问令牌来查询有关当前用户的信息”。很遗憾,您的链接无法正常工作。
【解决方案2】:

这里也一样。我跟着 Ben Biddington 的blog 获取了访问令牌。尝试使用时出现同样的错误。 Facebook 的 OAuth 实现并不完全遵循规范,只要文档清楚,我就可以接受,这显然不是这里的情况。另外,如果用户 ID 和用户名与访问令牌一起返回,那就太好了。

只是澄清一下——在你打电话之后

https://graph.facebook.com/oauth/authorize?

您应该收到一个代码,连同您的 CLIENT_ID 和 CLIENT_SECRET(假设您已注册您的应用程序)可以在

https://graph.facebook.com/oauth/access_token?

如果这确实是您通过 ACCESS_TOKEN 获得的方式,那么您应该可以请求

https://graph.facebook.com/me/

【讨论】:

  • 好像我的 FB 会话委托方法不起作用(fbDidLogin、fbDidNotLogin、fbDidLogout),所以我不知道我在调用授权后收到了什么。
  • - (void)request:(FBRequest *)request didFailWithError:(NSError *)error { NSLog(@"%@", [error localDescription]); NSLog(@"错误详情:%@", [错误描述]); };使用这个方法,用于 FBrquest 委托
  • didFailWithError 就像你提到的在我尝试发布到墙上后有效,在我尝试授权后应该调用的方法不会被调用。
  • 我一切正常,遇到了和这里一样的问题,也像这里一样解决了:stackoverflow.com/questions/5783782/fbdidlogin-not-called-ios
  • 我认为你一直在使用旧的 sdk
【解决方案3】:

为我解决错误10000,只需添加

[facebook handleOpenURL:url];

在回调中:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

info: 这个回调是在请求权限后调用的:

permissions =  [[NSArray arrayWithObjects:@"publish_stream",
                                          @"offline_access",
                                          nil] retain];
facebook = [[Facebook alloc] initWithAppId:@"yourappid"];
[facebook authorize:permissions delegate:self];

然后在这个回调中调用[facebook handleOpenURL:url],然后再尝试发布到墙上。 调用[facebook handleOpenURL:url]调用fbDidLogin回调!!

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    NSLog(@"URL: %@",url);  
    [facebook handleOpenURL:url];
    [facebook requestWithGraphPath:@"me/feed" 
                         andParams:[NSMutableDictionary dictionaryWithObject:@"test wall post"
                                                                      forKey:@"message"]
                     andHttpMethod:@"POST"
                       andDelegate:self];
}

黄昏

【讨论】:

    【解决方案4】:

    让我猜猜,您将 FB 代码提取到另一个类而不是在 AppDelegate 中实现它?

    我认为问题在于 FB 的页面指示我们在他们的演示代码中执行类似的操作:

    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
        return [facebook handleOpenURL:url];
    }
    

    但是,Facebook 的演示代码在 AppDelegate 中实现了整个逻辑。 如果您像我一样将 FB 通信代码提取到另一个类,则上述代码将无法正确执行(如果您的 AppDelegate 中有代码,则 facebook 变量未指向正确的对象。如果您有代码您提取的类,它不会被调用)并且您的令牌信息将不包括在内。

    我最终做的是:

    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
        return [fbModel handleOpenURL:url];
    }
    

    其中 fbModel 是一个实例变量,指向执行 FB 的代码。然后在我的 fbMode 实现中,我做了这样的事情:

    - (BOOL)handleOpenURL:(NSURL *)url
    {
        return [facebook handleOpenURL:url];
    }
    

    其中 facebook 是我的 FBModel 类中的一个 instacne 变量,因此在初始化时调用了 facebook = [[Facebook alloc] initWithAppId:AppID]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 2012-08-24
      • 2011-11-21
      • 2011-11-07
      • 1970-01-01
      相关资源
      最近更新 更多