我正在使用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应用程序。
希望有人知道答案。谢谢!
答案 0 :(得分:0)
根据Facebook文档https://developers.facebook.com/docs/mobile/ios/build/#implementsso上的SSO实施,你必须在AppDelegate.h代表上实现这一点:
@interface AppDelegate : UIResponder <UIApplicationDelegate,UIApplicationDelegate, FBSessionDelegate>
希望这可以提供帮助。