我正在使用 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 应用程序再次弹出。这变成了一个无限循环。
这是我的代码:
在 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 中实现。
我正在使用故事板。故事板中使用的起始 ViewController 是 LoginViewController。我确定当通过移动 safari 网络浏览器登录但不是通过 facebook 应用程序登录时 facebook sso 工作。
希望有人知道答案。谢谢!