IOS Facebook SSO:isSessionValid()在通过facebook app登录时返回false

时间:2012-07-22 19:33:17

标签: ios facebook ios5

我正在使用Objective C开发一个IOS5.1应用程序。我为我的应用程序登录功能实现了本地IOS应用程序http://developers.facebook.com/docs/reference/iossdk/authentication/的facebook SSO。

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

这是我的代码:

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

...所有必要的facebook协议都在LoginViewController.m中实现。

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

希望有人知道答案。谢谢!

1 个答案:

答案 0 :(得分:0)

根据Facebook文档https://developers.facebook.com/docs/mobile/ios/build/#implementsso上的SSO实施,你必须在AppDelegate.h代表上实现这一点:

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

希望这可以提供帮助。