iOS Facebook的SSO:isSessionValid()在通过Facebook登录时返回false应用

问题描述:

我正在开发一个使用Objective C的IOS5.1应用程序。我为我的应用程序登录功能实现了本机IOS应用程序0122,的Facebook SSO。iOS Facebook的SSO:isSessionValid()在通过Facebook登录时返回false应用

我的应用程序的流程从一个loginViewController开始。当用户在我的应用中登录登录按钮时,应用程序将检查isSessionValid()。如果该方法返回true,则用户将被引导至下一页。在配置手机上进行模拟时,我目前的应用程序能够将我引导至移动Safari浏览器(如果没有Facebook应用程序)或Facebook应用程序。当我通过Safari浏览器登录时,isSessionValid()返回true并将我引导到下一个视图页面。但是,如果在配置的Iphone中有Facebook应用程序,当我点击我的应用程序中的登录按钮时,facebook应用程序会弹出。 Facebook应用程序显示带有活动指示器“正在加载...”的白页,然后它将我引导回我的应用程序。当我再次点击登录按钮时,facebook应用程序再次弹出。这变成了一个无限循环。当我尝试通过配置的iphone上的Facebook应用登录时,我无法进入下一页。

这里是我的代码:

在AppDelegate.h:

@interface AppDelegate : UIResponder <UIApplicationDelegate> 
{ 
    NSMutableDictionary *userPermissions; 
} 
@property (nonatomic, retain) Facebook *facebook; 
@property (nonatomic, retain) UIWindow *window; 
@property (nonatomic, retain) LoginViewController *loginvc; 

在AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
    self.loginvc = [storyboard instantiateInitialViewController]; 
    self.window.rootViewController = loginvc; 

    facebook = [[Facebook alloc] initWithAppId:@"facebookID" andDelegate:self.loginvc]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
     && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 

    // Initialize user permissions 
    userPermissions = [[NSMutableDictionary alloc] initWithCapacity:1]; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [self.facebook handleOpenURL:url]; 
} 

在LoginViewController.m:

- (IBAction)loginViaFacebook:(id)sender 
{ 
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    if (![[delegate facebook] isSessionValid]) { 
     [[delegate facebook] authorize:permissions]; 
    } else { 
     [self performSegueWithIdentifier:@"signup" sender:self]; 
    } 
} 

- (void)fbDidLogin { 
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[[delegate facebook] accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[[delegate facebook] expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
} 

。所有必要的fac电子书协议在LoginViewController.m中实现。

我正在使用storyBoard。故事板中使用的起始ViewController是LoginViewController。 我确定当facebook sso在通过移动Safari浏览器登录时工作但不通过Facebook应用程序。

希望有人知道答案。谢谢!在Facebook上的文档,https://developers.facebook.com/docs/mobile/ios/build/#implementsso

根据SSO的实现,必须实现这个上AppDelegate.h代表:

@interface AppDelegate : UIResponder <UIApplicationDelegate,UIApplicationDelegate, FBSessionDelegate> 

希望这可以帮助。