2012-07-22 88 views
0

我正在開發一個使用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

回答

0

根據SSO的實現,必須實現這個上AppDelegate.h代表:

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

希望這可以幫助。