IOSparsingPFLoginViewController didLoginUser当通过Facebooklogin时没有调用委托,为什么?
这是一个非常奇怪的问题,因为我的Facebooklogin工作之前,我更新到Xcode 6和iOS 8.为了使这更奇怪的Twitter工作出色,但Facebook没有调用didLogincallback。
这是我在我的AppDelegate中做的事情:
@interface AppDelegate : UIResponder <UIApplicationDelegate, NSURLConnectionDataDelegate, UITabBarControllerDelegate, PFLogInViewControllerDelegate, PFSignUpViewControllerDelegate>
然后,我在application:didFinishLaunchingWithOptions:
设置了Facebook和Twitter application:didFinishLaunchingWithOptions:
[Parse setApplicationId:PARSE_APPLICATION_ID clientKey:PARSE_CLIENT_KEY]; [PFFacebookUtils initializeFacebook]; [PFTwitterUtils initializeWithConsumerKey:TWITTER_CONSUMER_KEY consumerSecret:TWITTER_CONSUMER_SECRET];
设置这些之后,我设置我的rootViewController像这样:
self.welcomeViewController = [[ConfigViewController alloc] init]; self.navController = [[UINavigationController alloc] initWithRootViewController:self.welcomeViewController]; [self.navController setNavigationBarHidden: NO]; self.window.rootViewController = self.navController; [self.window makeKeyAndVisible];
在我的ConfigViewController
的viewDidAppear
,我做了以下检查:
// Force logout for testing //[(AppDelegate *)[[UIApplication sharedApplication] delegate] logOut]; // If not logged in, present login view controller if (![PFUser currentUser]) { [(AppDelegate *)[[UIApplication sharedApplication] delegate] presentLoginViewControllerAnimated:NO]; return; } // Present UI [(AppDelegate *)[[UIApplication sharedApplication] delegate] presentTabBarController];
此时如果用户没有login,在presentLoginViewControllerAnimated
发生以下情况:
// Customize the Log In View Controller loginViewController = [[LoginViewController alloc] init]; loginViewController.delegate = self; loginViewController.facebookPermissions = @[@"email",@"public_profile",@"user_friends"]; loginViewController.fields = PFLogInFieldsUsernameAndPassword | PFLogInFieldsTwitter | PFLogInFieldsFacebook | PFLogInFieldsSignUpButton | PFLogInFieldsPasswordForgotten | PFLogInFieldsLogInButton; // Customize the Sign Up View Controller signUpViewController = [[SignupViewController alloc] init]; signUpViewController.delegate = self; signUpViewController.fields = PFSignUpFieldsDefault; loginViewController.signUpController = signUpViewController; [self.welcomeViewController presentViewController:loginViewController animated:NO completion:nil];
这里提供了loginViewController。 如果用户点击Twitterbutton,他将毫无困难地login。 如果点击Facebookbutton,Facebook确认屏幕出现,我点击确定,然后返回到我的loginViewController。 我需要这个被称为:
- (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user
这样我可以closuresloginViewController并执行任何其他操作。 任何想法为什么这可能发生?
同样,为什么loginViewController:didLogInUser:委托不被Facebook调用?
任何帮助是极大的赞赏!
[编辑]
经过多次testing和许多令人头痛的事情,这是最新的。
如果我搞砸了我的Info.plist中的URL Schemes
架构,它的作品。 我将URL Schemes
的名称更改为URL Scheme
,出现以下错误:
FBSDKLog: Cannot use the Facebook app or Safari to authorize, fb6************** is not registered as a URL Scheme
即使我得到这个错误,我得到一个屏幕popuplogin到FaceBook。 我填写了,我在,它的工作原理,我可以loginFacebook。 这似乎并不方便,但它工作。
其他testing/我尝试的东西是下载Facebook应用程序,并尝试login,没有Facebook应用程序(通过Safari)login,在我的welcomeViewController而不是我的AppDelegate执行委托,并更新Parse / Facebook SDKs。
我认为这个问题可能与开放Facebook或Safari等其他应用程序有关。 我倾向于这个原因是因为Twitter的屏幕是一个模式popup视图,它没有问题。 当Facebook给我这个错误,它不会切换到Safari或Facebook的应用程序,而是显示模式popuplogin,它工作正常。 这导致我相信,这个问题是关于切换应用程序,而不是正确接收callback。
我也有第三个login选项,我忽略了提及。 这个第三个选项只需要在没有社交媒体帐户的情况下注册,这也是可行的。
巨大的感谢,马特唐指着我在正确的方向。
事实certificate,我不小心删除/注释了这3个callback的部分,这是问题的根源。 最后,我的解决scheme是实现application:handleOpenURL:
和application:openURL:sourceApplication:annotation:
// Facebook oauth callback - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [FBSession.activeSession handleOpenURL:url]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication withSession:[PFFacebookUtils session]]; }
并取消注释这一行:
[FBAppCall handleDidBecomeActiveWithSession:[PFFacebookUtils session]];
我在这个callback里面有这个内容:
- (void)applicationDidBecomeActive:(UIApplication *)application;
对我来说,原因是切换到testingFB应用程序,在那里你需要改变appID。 这些请求有不同的令牌,特别是我使用的前一个令牌(不是在FB上创build一个testing应用程序后生成的令牌)。
我的解决scheme是从模拟器中删除应用程序,并再次运行。