我正在使用FBConnect SDK来通过我的应用程序向用户的个人资料发布帖子。我遇到了一些问题:
当相关代码第一次在设备上运行时,用户会被重定向到 Facebook 应用程序/网站,并要求授权。如果用户授权,则返回应用程序,弹出一个“连接到 Facebook”视图控制器,要求用户登录。这很奇怪,因为用户已经登录,否则他如何授权应用程序?但我想这可能没关系,因为他还没有通过应用程序登录。在他登录后,什么也不会发生。只有第二次运行代码,在他授权应用程序之后,用户才会得到发布对话框。
如果用户没有授权该应用程序,则在授权对话框返回我的应用程序后,它会要求用户登录(就像他已经授权一样),并在他登录后什么也不做。只有第二次运行代码时,授权对话框才会打开,其中包括“授权”和“离开应用程序”的选项,而不是“授权”和“不授权”/“允许”和“不允许”。
此外,如果用户通过其 Facebook 帐户的设置删除了授权,而不仅仅是要求他重新授权,Facebook 对话框将弹出(而不是发布/授权对话框),显示“发生错误。请稍后再试。”稍后再试也没有帮助。它将始终弹出,即使您重新启动应用程序。使其消失的唯一方法是重新安装应用程序,这将导致它重新弹出授权对话框。
所以这就是我想要实现的:
1. 用户授权应用程序后,他不需要再次登录。 2. 用户授权应用程序后,发布对话框将立即弹出,而无需重新运行代码(触发按钮)。 3. 如果用户取消授权该应用程序,则会再次提示授权对话框,而不是错误对话框。 4. 如果他拒绝了授权,则会调用一个显示错误等功能的函数。
以下是相关代码:
MyViewController.m
当相关代码第一次在设备上运行时,用户会被重定向到 Facebook 应用程序/网站,并要求授权。如果用户授权,则返回应用程序,弹出一个“连接到 Facebook”视图控制器,要求用户登录。这很奇怪,因为用户已经登录,否则他如何授权应用程序?但我想这可能没关系,因为他还没有通过应用程序登录。在他登录后,什么也不会发生。只有第二次运行代码,在他授权应用程序之后,用户才会得到发布对话框。
如果用户没有授权该应用程序,则在授权对话框返回我的应用程序后,它会要求用户登录(就像他已经授权一样),并在他登录后什么也不做。只有第二次运行代码时,授权对话框才会打开,其中包括“授权”和“离开应用程序”的选项,而不是“授权”和“不授权”/“允许”和“不允许”。
此外,如果用户通过其 Facebook 帐户的设置删除了授权,而不仅仅是要求他重新授权,Facebook 对话框将弹出(而不是发布/授权对话框),显示“发生错误。请稍后再试。”稍后再试也没有帮助。它将始终弹出,即使您重新启动应用程序。使其消失的唯一方法是重新安装应用程序,这将导致它重新弹出授权对话框。
所以这就是我想要实现的:
1. 用户授权应用程序后,他不需要再次登录。 2. 用户授权应用程序后,发布对话框将立即弹出,而无需重新运行代码(触发按钮)。 3. 如果用户取消授权该应用程序,则会再次提示授权对话框,而不是错误对话框。 4. 如果他拒绝了授权,则会调用一个显示错误等功能的函数。
以下是相关代码:
MyViewController.m
- (void)shareOnFacebook
{
Facebook *facebook = [[Facebook alloc] initWithAppId:myAppID];
[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] setFacebook:facebook];
[facebook release];
facebook = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] facebook];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) {
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
if (![facebook isSessionValid]) {
[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]];
}
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
//Giving the dictionary some parameters for posting defaults
[facebook dialog:@"feed" andParams:dictionary andDelegate:self]; //Note: we have 2 different delegates! appDelegate for connections & url switching, and self for dialogs
}
MyAppDelegate.h
@interface MyAppDelegate : NSObject <UIApplicationDelegate, FBSessionDelegate, FBDialogDelegate>
{
Facebook *facebook; // kept for facebook sharing, accessed only from MyViewController although delegate methods are handeled in here
}
@property (nonatomic, retain) Facebook *facebook;
@end
MyAppDelegate.m
- (void)fbDidLogin
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [self.facebook handleOpenURL:url];
}
我可能错过了MyViewController上的一些委托函数吗?因为我看到我将其标记为实现FBDialogDelegate协议,尽管它没有实现那里的任何函数。
如果你们能帮助我,我会非常高兴,因为这对我来说非常令人沮丧。我在互联网上找不到任何关于此事的信息,感觉好像我正在被淹没。
提前感谢!