iOS 应用程序中的 Facebook 连接

Posted

技术标签:

【中文标题】iOS 应用程序中的 Facebook 连接【英文标题】:Facebook Connection in iOS App 【发布时间】:2013-07-23 12:00:00 【问题描述】:

在我的新 ios 应用程序中,我必须登录 Facebook 并获取用户详细信息。我在这里阅读了教程 - http://developers.facebook.com/docs/tutorials/ios-sdk-tutorial/authenticate/ 并研究了 Scrumptious 和其他示例。但我无法理解流程。

我创建了一个示例项目来进行 Facebook 登录(代码如下)-但主要问题如下:

为什么当我再次点击登录按钮时应用程序要求授权 - 在我点击 Facebook 上的“确定”一次之后

下面是我的代码-

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // See if the app has a valid token for the current state.
    if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded)
    
        // To-do, show logged in view --- LOGGED IN : Already Login
        // Yes, so just open the session (this won't display any UX).
        UIWindow *window = [UIApplication sharedApplication].keyWindow;
        ViewController *rootViewController = (ViewController *)window.rootViewController;
        [rootViewController openSession];        
    

    return YES;


- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation

    return [FBSession.activeSession handleOpenURL:url];


- (void)applicationDidBecomeActive:(UIApplication *)application

    [FBSession.activeSession handleDidBecomeActive];



@implementation ViewController

@synthesize lblStatus;

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    lblStatus.text = @"Login Now";


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (IBAction)login:(id)sender

    [self openSession];


- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error

    switch (state) 
        case FBSessionStateOpen:
        
            // Connection is Open
            lblStatus.text = @"FBSessionStateOpen";
        
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
        
            [FBSession.activeSession closeAndClearTokenInformation];

            // Connection is Closed / Login Failed
            lblStatus.text = @"FBSessionStateClosed";
        
            break;
        default:
            break;
    


- (void)openSession

    [FBSession openActiveSessionWithReadPermissions:nil
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session,
       FBSessionState state, NSError *error)
     
         [self sessionStateChanged:session state:state error:error];
     ];

回答---->

感谢 nerowolfe 的建议。

以下是我连接到 Facebook 的完整解决方案。我的下一个任务是现在获取用户数据。

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation

    return [FBSession.activeSession handleOpenURL:url];


- (void)applicationDidBecomeActive:(UIApplication *)application

    [FBSession.activeSession handleDidBecomeActive];


--------------------------

@implementation ViewController

@synthesize lblStatus;

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    lblStatus.text = @"Login Now";


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (IBAction)login:(id)sender

    [self openSession];


- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error

    switch (state) 
        case FBSessionStateOpen:
        
            // Connection is Open
            lblStatus.text = @"FBSessionStateOpen";
        
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
        
            [FBSession.activeSession closeAndClearTokenInformation];

            // Connection is Closed / Login Failed
            lblStatus.text = @"FBSessionStateClosed";
        
            break;
        default:
            break;
    


- (void)openSession

    if(FBSession.activeSession.isOpen)
    
        [FBSession openActiveSessionWithReadPermissions:nil
                                           allowLoginUI:NO
                                      completionHandler:
         ^(FBSession *session,
           FBSessionState state, NSError *error)
         
             [self sessionStateChanged:session state:state error:error];
         ];
    
    else
    
        [FBSession openActiveSessionWithReadPermissions:nil
                                           allowLoginUI:YES         
                                      completionHandler:
         ^(FBSession *session,
           FBSessionState state, NSError *error)
         
             [self sessionStateChanged:session state:state error:error];
         ];
    


- (IBAction)logout:(id)sender

    [FBSession.activeSession closeAndClearTokenInformation];

    if(FBSession.activeSession.isOpen)
        lblStatus.text = @"Open Still";
    else
        lblStatus.text = @"Close";


【问题讨论】:

【参考方案1】:

只是不显示 LoginUI。

 - (void)openSession

 if(FBSession.activeSession.isOpen)
 

       [FBSession openActiveSessionWithReadPermissions:nil
                                   allowLoginUI:NO
                              completionHandler:
                     ^(FBSession *session,
                         FBSessionState state, NSError *error)
       
        [self sessionStateChanged:session state:state error:error];
       ];
    

 

【讨论】:

是的,这有帮助。现在,当会话打开时,我不再获得登录屏幕/授权屏幕。另一件事是 - 如果我想使用其他用户登录怎么办 - 我如何注销或终止当前会话 您发布的代码有两点 - 1. FBSession.activeSession.isOpen :这意味着我们正在检查会话是否处于活动状态,然后只进入内部。我们不应该检查“会话是否处于活动状态”吗? 2. "allowLoginUI:YES" 和 "allowLoginUI:NO" - 这有什么影响? 当然如你所愿。我刚刚向您展示了方式...顺便说一句,当然要使用 facebook sdk 方法,您需要在 FBRequest *postLocRequest = [FBRequest requestForPlacesSearchAtCoordinate:currentLocation radiusInMeters:1000 resultsLimit:1 searchText:self.location.name 之前分配活动会话]; postLocRequest.session = FBSession.activeSession;

以上是关于iOS 应用程序中的 Facebook 连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 SDK 3.5 在 iOS 上连接 Facebook

iOS Facebook 登录但不能连接?

当我在 Safari 中将应用程序切换到 Facebook 时,防止 IOS 重新启动应用程序

安装了 Facebook 应用程序的 Facebook SDK iOS 登录

iOS:无需离开应用授权即可连接 Facebook

如何创建类似于 iOS 的 facebook 应用程序的侧边栏? [复制]