Facebook的FBConnect SDK在iOS上发布

Niv*_*Niv 8 iphone facebook objective-c fbconnect ios

我正在使用FBConnect sdk通过我的应用程序将帖子发布到用户的个人资料.我遇到了很多问题:

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

如果用户没有授权应用程序,当它在授权对话框后返回我的应用程序时,它会要求用户登录(就像他授权一样),并且在他登录后什么都不做.只是第二次代码运行,授权对话框打开,使用optinos"授权"和"离开应用程序",而不是"授权"和"不授权"/"允许"和"不允许".

此外,如果用户通过他在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
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)

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

如果你们能帮助我,我会很高兴,因为这对我来说非常令人沮丧.我在互联网上找不到这个,我觉得我在这里淹死了.

Tnx提前!

Ben*_*her 8

第一:

[facebook authorize:[NSArray arrayWithObjects:@"publish_stream",@"offline_access",nil] delegate:self];
Run Code Online (Sandbox Code Playgroud)

offline_access此处的密钥将永久保持您的身份验证令牌(或者更具体地说,直到用户在其Facebook帐户设置中手动取消授权您的应用程序设置).此外,将您的活动VC设置为委托(稍后将详细介绍).

其次:

-(void)popUserShareFeed {
  NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
  //Giving the dictionary some parameters for posting defaults
  [facebook dialog:@"feed" andParams:dictionary andDelegate:self];
}
Run Code Online (Sandbox Code Playgroud)

-fbDidLogin委托方法中调用此方法(或类似方法).如果会话仍然有效,也可以使用原始方法调用它,即:

if (![facebook isSessionValid]) {
        [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]];
} else {
  [self popUserShareFeed];
}
Run Code Online (Sandbox Code Playgroud)

......和你的新人fbDidLogin:

- (void)fbDidLogin
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];
    [self popUserShareFeed];
}
Run Code Online (Sandbox Code Playgroud)

(注意:您必须将其定义MyViewController.m并将其用作您的FBSessionDelegate.它将在功能上等同.您AppDelegate不需要也是您的FBSessionDelegate.

第三:

实现-fbDidNotLogin:(BOOL)cancelled FBSessionDelegate方法,如下所示:

-(void)fbDidNotLogin:(BOOL)cancelled {
   if (cancelled) {
      ... some alert about the user cancelling...
   } else {
      ... some alert about how it failed for some reason...
   }
}
Run Code Online (Sandbox Code Playgroud)

第四,就你的奇怪错误而言:A)Facebook SDK一般都不是很好,而B)我只会在你的facebook对象上设置auth令牌和到期日期

A)你还没有一个实例化(即,它nil)

B)你设置的expirationDate是将来的(即调用它的timeIntervalSinceNow[ NSDate实例方法]返回> 0).