Iphone Can';t使用iOS SDK发布到facebook墙(授权问题)

Iphone Can';t使用iOS SDK发布到facebook墙(授权问题),iphone,objective-c,facebook,Iphone,Objective C,Facebook,首先,我使用appId创建facebook对象: facebook = [[Facebook alloc] initWithAppId:kAppId]; 当我打电话时 [_facebook authorize:_permissions delegate:self] 我的safari将打开,在我输入我的FB用户名和密码后,safari将关闭,所有内容都将返回到我的应用程序(就像它应该的那样)。 我的权限是: _permissions = [[NSArray arrayWithObjects

首先,我使用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失败,错误为操作无法完成。(FaceBookErrorDomain错误10000)。”。这一定与授权有关,但由于我在授权呼叫后没有收到任何消息,我不知道该怎么做

有什么想法吗

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"}
}
}
2011-05-27 11:19:57.313 Challengein[7704:207]操作无法完成。(FaceBookerDomain错误10000。)
2011-05-27 11:19:57.314 Challengein[7704:207]错误详细信息:Error Domain=facebookerdomain Code=10000“操作无法完成。(facebookerdomain Error 10000。)”UserInfo=0x6878b90{Error={type=mutable dict,count=2,
条目=>
2:{contents=“type”}={contents=“OAuthException”}
3:{contents=“message”}={contents=“(#100)图片URL格式不正确”}
}
}
请尝试此链接
这里也是一样。我跟着本·比丁顿去拿通行证。尝试使用时出现相同错误。Facebook的OAuth实现并不完全遵循规范,只要文档清晰,我就可以使用它,这里显然不是这样。同样,如果userid和username与访问令牌一起返回就好了

我只是想澄清一下,在你打电话之后

https://graph.facebook.com/oauth/authorize?
您应该会收到一个代码,该代码与您的客户端\u ID和客户端\u机密(假设您已注册您的应用程序)一起,可以在

https://graph.facebook.com/oauth/access_token?
如果这确实是您使用访问令牌的方式,那么您应该能够请求

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

要解决错误10000,只需添加

[facebook handleOpenURL:url];
在回调中:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
信息:此回调在请求权限后调用,如:

permissions =  [[NSArray arrayWithObjects:@"publish_stream",
                                          @"offline_access",
                                          nil] retain];
facebook = [[Facebook alloc] initWithAppId:@"yourappid"];
[facebook authorize:permissions delegate:self];
然后在这个回调中,在尝试在墙上发布之前,只需调用
[facebook handleopeanurl: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];
}

Twil

让我猜猜,您将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]在初始化时被调用。

您请求了什么权限?我用权限更新了我的帖子。sidenote:上述代码对于facebook iOS SDK 3.x不再有效,错误详细信息如下:“必须使用活动访问令牌查询有关当前用户的信息”。不幸的是,您的链接无法正常工作。类似我的FB会话委托方法的消息无法正常工作(fbDidLogin、fbDidNotLogin、fbDidLogout),因此我不知道调用authorize后收到了什么。-(void)request:(FBRequest*)request didFailWithError:(NSError*)错误{NSLog(@“%@,[错误本地化描述]);NSLog(@“错误详细信息:%@,[错误描述]);};使用FBrequest DelegateDidFailWitheror的这种方法,就像你提到的那样,在我尝试发布到墙上后工作,应该在我尝试授权后调用的方法不会被调用。我把一切都安排好了,遇到了与这里相同的问题,也像这里一样解决了:我想你一直在使用旧sdk