Facebook SDK集成-使用视图控制器而不是应用程序代理



正如标题所示,我现在发现自己在iOS应用程序中使用了新的Facebook SDK。

我遵循了Facebook开发者网站上概述的介绍,一切都正常工作——至少根据它们的实现。

他们的行事方式意味着,在调用applicationDidFinishLaunching后,用户可以选择通过应用程序委托中的一系列方法和调用将其帐户连接到应用程序。

相反,我只想在选择隐藏在应用程序其他地方的视图控制器中的按钮时强制执行此操作。也就是说,当调用applicationDidFinishLaunching时,我不想处理授权问题——我希望在视图控制器中使用我自己的方法来强制它。此外,如果有什么不同的话,我将引用我自己的一些视图控制器中的Facebook类。

我已经找了很多地方,还没有找到一个完全解释过的解决方案(或者任何东西,真的)来处理这个问题。如果有人对此有什么想法,请告诉我。StackOverflow在大多数情况下是最后的手段:)

编辑:正如铍在下面提到的那样,我可以简单地将应用程序代理中的所有内容都放入每个单独的视图控制器中。它是有效的,但这是处理这种独特情况的最佳方式,还是有更好的实现?

谢谢你,

以下相关代码:

sampleAppDelegate.h

@interface sampleAppDelegate : NSObject <UIApplicationDelegate,FBRequestDelegate, FBSessionDelegate, FBDialogDelegate, FBLoginDialogDelegate> {
Facebook *facebook;
}
@property (nonatomic, retain) Facebook *facebook;
@end

sampleAppDelegate.m

  @synthesize facebook;
      facebook = [[Facebook alloc] initWithAppId:@"102698856525645" andDelegate:self];
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if ([defaults objectForKey:@"FBAccessTokenKey"] 
            && [defaults objectForKey:@"FBExpirationDateKey"]) {
            facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
            facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
        }
        if (![facebook isSessionValid]) {
            NSArray *permissions = [[NSArray alloc] initWithObjects:
                                    @"offline_access", 
                                    @"publish_stream",
                                    nil];
            [facebook authorize:permissions];
            [permissions release];   
        } 
    }
    // For 4.2+ support
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        return [facebook handleOpenURL:url]; 
    }
    - (void)fbDidLogin {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
        [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
        [defaults synchronize];
    } 
/*methods required by Facebook SDK to handle issues with connectivity--all currently empty*/

viewController.h

#import "FBConnect.h"
#import "sampleAppDelegate.h"
@class sampleAppDelegate;

@interface viewController : UIViewController <FBRequestDelegate> {
    Facebook *facebook;
        UnitedUpdatesAppDelegate *facebookSampleAppDelegate;

}
@property (nonatomic, retain) sampleAppDelegate *appDelegate;
@property (nonatomic, retain) Facebook *facebook;

viewController.m

-(void) facebookPost {
    NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   @"http://stackoverflow.com", @"link",
                                   @"Message name", @"name",
                                   @"Caption", @"caption",
                                   @"Description", @"description",
                                   @"Message",  @"message",
                                   nil];
    [sampleAppDelegate dialog:@"feed" andParams:params andDelegate: sampleAppDelegate];
}

我认为这个Facebook代码不应该是任何视图控制器的一部分。我更喜欢创建一个Singleton类来处理与Facebook的通信。这个Singleton符合某个接口,从而更方便地将Twitter等其他服务添加到应用程序中(每个服务都可以由符合共享接口的单独Singleton处理)。

该接口可以定义-login:-ologout:-postMessage:

singleton可能使用委托或块以类似的方式处理web服务响应,例如,在委托实现的情况下,一些方法可以被称为-service:didSceceedWithStatus:.service:didFailWithError:ervice参数将指示发送委托消息的服务或singleton实例的类型)。

事实上,我确实根据上面的描述写了一些代码,如果你感兴趣,可以把它发布在这里。

如果您询问在AppDelegate之外的其他地方使用委托方法是否可能,甚至更好,答案是肯定的。

我的想法是准备一个包含FB所有内容的类,并有一个可以触发登录和/或身份验证的按钮。

通常,这足以使您的控制器采用FB类所需的协议,并将其委托给回调。

我尝试了类似的方法,效果很好。

最新更新