Iphone Facebook';iOS上的FBConnect SDK问题

Iphone Facebook';iOS上的FBConnect SDK问题,iphone,objective-c,ios,facebook,fbconnect,Iphone,Objective C,Ios,Facebook,Fbconnect,我使用FBConnect sdk通过我的应用程序将帖子发布到用户的个人资料中。我对此有很多问题: 当相关代码首次在设备上运行时,用户会根据需要重新定向到facebook应用程序/网站,并要求其授权。如果用户授权,它将返回应用程序,弹出一个“连接到facebook”视图控制器,要求用户登录。这很奇怪,因为用户已经登录,否则他怎么能授权应用?但我想这可能没问题,因为他还没有通过应用程序登录。他登录后,它什么也不做。只有在代码第二次运行时,在用户授权应用程序后,才会出现发布对话框。 如果用户未授权应用

我使用FBConnect sdk通过我的应用程序将帖子发布到用户的个人资料中。我对此有很多问题:

当相关代码首次在设备上运行时,用户会根据需要重新定向到facebook应用程序/网站,并要求其授权。如果用户授权,它将返回应用程序,弹出一个“连接到facebook”视图控制器,要求用户登录。这很奇怪,因为用户已经登录,否则他怎么能授权应用?但我想这可能没问题,因为他还没有通过应用程序登录。他登录后,它什么也不做。只有在代码第二次运行时,在用户授权应用程序后,才会出现发布对话框。

如果用户未授权应用程序,则在“授权”对话框后返回到“我的应用程序”时,它会要求用户登录(就像他授权一样),并且在用户登录后不会执行任何操作。只有第二次运行代码时,授权对话框才会打开,选项为“授权”和“离开应用程序”,而不是“授权”和“不授权”/“允许”和“不允许”

此外,如果用户通过facebook上的帐户设置删除了他的授权,而不仅仅是要求他重新授权,facebook会弹出一个对话框(而不是post/授权对话框),说:“发生错误。请稍后再试。”稍后再试没有帮助。即使重新启动应用程序,它也会一直弹出。使其消失的唯一方法是重新安装应用程序,这将导致它重新弹出授权对话框。

因此,以下是我想要实现的目标:

  • 用户授权应用程序后,就不必再次登录了。
  • 用户授权应用程序后,发布对话框将立即弹出,而无需重新运行代码(顺便说一句,该代码是通过按钮触发的)。
  • 如果用户取消对应用程序的授权,他将再次收到授权对话框的提示,而不是错误对话框
  • 如果他拒绝授权,我将调用显示错误等的函数
  • 以下是相关代码:

    MyViewController.m

    MyAppDelegate.h

    我是否可能缺少MyViewController上的几个委托函数?因为我看到出于某种原因,我将其标记为实现FBDialogDelegate协议,尽管他没有从那里实现任何功能。


    如果你们能帮助我,我会非常高兴,因为这对我来说是非常令人沮丧的。我在网上找不到这方面的任何信息,我觉得我在这里快要淹死了。

    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]; 
    }