IOS Parses PFLoginViewController didLoginUser Delegate 在通过 Facebook 登录时没有被调用,为什么?

标签 ios objective-c facebook parse-platform pfloginviewcontroller

这是一个非常奇怪的问题,因为在我更新到 Xcode 6 和 iOS 8 之前,我的 Facebook 登录是有效的。更奇怪的是,Twitter 运行良好,但 Facebook 没有调用 didLogin 回调。

这是我在 AppDelegate 中所做的:

@interface AppDelegate : UIResponder <UIApplicationDelegate, NSURLConnectionDataDelegate, UITabBarControllerDelegate, PFLogInViewControllerDelegate, PFSignUpViewControllerDelegate>

然后我在 application:didFinishLaunchingWithOptions:

中设置 Facebook 和 Twitter
[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];

在我的 ConfigViewControllerviewDidAppear 中,我执行以下检查:

// 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];

此时,如果用户未登录,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。如果用户点击 Twitter 按钮,他将毫无问题地登录。但是,如果点击 Facebook 按钮,将显示 Facebook 确认屏幕,我点击确定,然后它返回到我的 loginViewController。我需要调用它:

- (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user

这样我就可以关闭 loginViewController 并执行任何其他操作。知道为什么会发生这种情况吗?

同样,为什么 loginViewController:didLogInUser: delegate 没有被 Facebook 调用?

非常感谢任何帮助!

[编辑]

经过大量测试和许多令人头疼的问题,这是最新的。

如果我搞砸了我的 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

即使出现此错误,我仍会收到一个用于登录 FaceBook 的屏幕弹出窗口。我填写它并进入,它有效,我可以使用 Facebook 登录。这看起来不太方便,但确实有效。

我尝试的其他测试/事情是下载 Facebook 应用程序并尝试登录,不使用 Facebook 应用程序登录(通过 safari),在我的 welcomeViewController 而不是我的 AppDelegate 中实现委托(delegate),以及更新 Parse/Facebook SDK。

我认为问题可能与打开其他应用程序(如 Facebook 或 Safari)有关。我倾向于这个的原因是因为推特屏幕是一个模态弹出 View 并且它可以正常工作。当 Facebook 给我这个错误时,它不会切换到 safari 或 Facebook 应用程序,而是显示一个模态弹出的登录名,并且工作正常。这使我相信问题与切换应用程序和未正确接收回调有关。

我还有第三个登录选项,我忽略了。第三种选择只需注册即可,无需社交媒体帐户即可使用,而且这种方法也有效。

非常感谢 Matt Tang 为我指明了正确的方向。

最佳答案

事实证明,我不小心删除/注释掉了这 3 个回调的部分内容,这就是问题的根源。最后,我的解决方案是实现 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]];

我在这个回调中有:

- (void)applicationDidBecomeActive:(UIApplication *)application;

关于IOS Parses PFLoginViewController didLoginUser Delegate 在通过 Facebook 登录时没有被调用,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26444612/

相关文章:

javascript - 出现 Facebook 对话框但始终显示 "An error has occurred"

javascript - 注销 Facebook 但它仍然重新识别 $user

ios - 防止 moveRowAtIndexPath 超出固定索引

ios - 为什么 Google map 不能拉伸(stretch)以适应我的 UIView?

objective-c - 如何在 mac osx 中为文件类型设置自定义图标

java - Android - Conceal Facebook 登录按钮

ios - iOS 中的数据模型持久性注意事项

ios - iOS后台任务选项有哪些

iphone - UICollectionView:如何在页脚和页眉之间添加空间?

objective-c - 将不同的字符一个一个地添加到 NSString 中?