Iphone Facebook';iOS上的FBConnect SDK问题
我使用FBConnect sdk通过我的应用程序将帖子发布到用户的个人资料中。我对此有很多问题: 当相关代码首次在设备上运行时,用户会根据需要重新定向到facebook应用程序/网站,并要求其授权。如果用户授权,它将返回应用程序,弹出一个“连接到facebook”视图控制器,要求用户登录。这很奇怪,因为用户已经登录,否则他怎么能授权应用?但我想这可能没问题,因为他还没有通过应用程序登录。他登录后,它什么也不做。只有在代码第二次运行时,在用户授权应用程序后,才会出现发布对话框。Iphone Facebook';iOS上的FBConnect SDK问题,iphone,objective-c,ios,facebook,fbconnect,Iphone,Objective C,Ios,Facebook,Fbconnect,我使用FBConnect sdk通过我的应用程序将帖子发布到用户的个人资料中。我对此有很多问题: 当相关代码首次在设备上运行时,用户会根据需要重新定向到facebook应用程序/网站,并要求其授权。如果用户授权,它将返回应用程序,弹出一个“连接到facebook”视图控制器,要求用户登录。这很奇怪,因为用户已经登录,否则他怎么能授权应用?但我想这可能没问题,因为他还没有通过应用程序登录。他登录后,它什么也不做。只有在代码第二次运行时,在用户授权应用程序后,才会出现发布对话框。 如果用户未授权应用
如果用户未授权应用程序,则在“授权”对话框后返回到“我的应用程序”时,它会要求用户登录(就像他授权一样),并且在用户登录后不会执行任何操作。只有第二次运行代码时,授权对话框才会打开,选项为“授权”和“离开应用程序”,而不是“授权”和“不授权”/“允许”和“不允许” 此外,如果用户通过facebook上的帐户设置删除了他的授权,而不仅仅是要求他重新授权,facebook会弹出一个对话框(而不是post/授权对话框),说:“发生错误。请稍后再试。”稍后再试没有帮助。即使重新启动应用程序,它也会一直弹出。使其消失的唯一方法是重新安装应用程序,这将导致它重新弹出授权对话框。
因此,以下是我想要实现的目标:
如果你们能帮助我,我会非常高兴,因为这对我来说是非常令人沮丧的。我在网上找不到这方面的任何信息,我觉得我在这里快要淹死了。
Tnx提前 听起来您遇到了与本文所述相同的问题。我遇到了同样的问题,但在网上。在这个帖子中,Facebook只给出了一个回复,这是错误的信息
Facebook拥有有史以来最差的开发者文档和开发者支持,我不会屏息等待解决方案。我已经在这么多应用程序中集成了FBConnect,但从未遇到过这样的关键问题。因此,您的代码中可能缺少一些内容: 不必检查FBAccessTokenKey和FBExpirationDateKey,只需使用FBConnect的FBSession类的session对象即可 只需尝试使用我的代码和一些conidtion:
session = [[FBSession sessionForApplication:@"key" secret:@"AppSecretKey" delegate:self] retain];
[session resume];
_posting = YES;
// If we're not logged in, log in first...
if (![session isConnected]) {
loginDialog = nil;
loginDialog = [[FBLoginDialog alloc] init];
[loginDialog show];
}
// If we have a session and a name, post to the wall!
else if (_facebookName != nil) {
[self postToWall]; // Over here posting dialog will appear , if user has already logged in or session is running.
}
}
else {
[FBBtn setTitle:@"Login" forState:UIControlStateNormal]; // if you want to change the title of button
[session logout];
}
另外,请注意仅在dealloc方法中释放会话对象,而不是在任何其他方法中释放它
- (void)dealloc {
[super dealloc];
[session release];
session = nil;
}
希望这能解决你的问题 不是代码问题的直接解决方案,但是 你是否考虑过使用开源库来解决这个问题?ShareKit就是一个很好的例子:。集成非常简单,可以满足您的所有需求 首先:
[facebook authorize:[NSArray arrayWithObjects:@"publish_stream",@"offline_access",nil] delegate:self];
这里的离线访问
键将使您的身份验证令牌永远保持活动状态(或者更具体地说,直到用户在其Facebook帐户设置中的应用程序设置中手动取消对您的应用程序的授权)。另外,将您的活动VC设置为代理(稍后将详细介绍)
第二:
-(void)popUserShareFeed {
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
//Giving the dictionary some parameters for posting defaults
[facebook dialog:@"feed" andParams:dictionary andDelegate:self];
}
在-fbdilogin
委托方法中调用此方法(或类似方法)。如果会话仍然有效,也可以在原始方法中调用它,即:
if (![facebook isSessionValid]) {
[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]];
} else {
[self popUserShareFeed];
}
…和新的fbdilogin
:
- (void)fbDidLogin
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
[self popUserShareFeed];
}
(注意:您必须在MyViewController.m
中定义它,并将其用作您的FBSessionLegate
。它在功能上是等效的。您的AppDelegate
不需要也是您的FBSessionLegate
第三:
实现-fbdindotlogin:(BOOL)cancelled
fbsessionelegate
方法,如下所示:
-(void)fbDidNotLogin:(BOOL)cancelled {
if (cancelled) {
... some alert about the user cancelling...
} else {
... some alert about how it failed for some reason...
}
}
第四,就你的bizarro错误而言:A)Facebook SDK一般不太好,B)如果
A) 您还没有实例化一个(即nil
)
及
B) 您正在设置的expirationDate是在将来(即调用它的
TimeIntervalenceNow
[调用它的NSDate
实例方法]返回>0)。我遇到了完全相同的问题,并使用了Ben Mosher的上述响应,但我还决定为Facebook对象创建一个简单的单例类,因此,在我的AppDelegate中,我可以正确处理以下函数:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [[[FBManager defaultManager] facebook] handleOpenURL:url];
//return [facebook handleOpenURL:url];
}
我的singleton类既是FBSessionDelegate
又是FBDialogDelegate
,因此它处理相应的方法
这允许我仅在用户实际尝试发布内容时提示用户登录,而不是在应用程序启动时 我遇到了类似但不相同的问题:始终显示消息“出现错误。请稍后再试。” 问题在于没有正确配置应用程序ID——它是由客户提供的(所以我不确定到底是什么地方出了问题);自从我用自己的测试应用程序I替换它以来,一切都正常工作
- (void)fbDidLogin
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
[self popUserShareFeed];
}
-(void)fbDidNotLogin:(BOOL)cancelled {
if (cancelled) {
... some alert about the user cancelling...
} else {
... some alert about how it failed for some reason...
}
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [[[FBManager defaultManager] facebook] handleOpenURL:url];
//return [facebook handleOpenURL:url];
}