IOS Parses PF Login ViewController在通过Facebook登录时没有调用LoginUser Delegate,为啥?

Posted

技术标签:

【中文标题】IOS Parses PF Login ViewController在通过Facebook登录时没有调用LoginUser Delegate,为啥?【英文标题】:IOS Parses PFLoginViewController didLoginUser Delegate is not being called when logging in via Facebook, why?IOS Parses PF Login ViewController在通过Facebook登录时没有调用LoginUser Delegate,为什么? 【发布时间】:2014-10-18 21:12:13 【问题描述】:

这是一个非常奇怪的问题,因为我的 Facebook 登录在我更新到 Xcode 6 和 ios 8 之前就可以工作。更奇怪的是,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: 没有为 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 中实现委托,以及更新 Parse/Facebook SDK。

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

我还有第三个登录选项,我没有提及。这第三个选项只需在没有社交媒体帐户的情况下注册即可工作,这也有效。

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

【问题讨论】:

当它返回到你的 loginViewController 时,你确定你真的登录了吗?实现 logInViewController:didFailToLogInWithError: 看看是否被调用 我已经实现了它并没有被调用。 你已经在 AppDelegate.m 中实现了这两个?让我继续看你的代码。 我实际上已经实现了所有登录回调,并且没有为 Facebook 调用任何回调。 你能展示你所有的 AppDelegate.m 吗? 【参考方案1】:

事实证明,我不小心删除/注释了这 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;

【讨论】:

不错。你想通了【参考方案2】:

对我来说,原因是切换到测试 FB 应用程序,您需要在其中更改 appID。然后请求具有不同的令牌,尤其是我使用的前一个令牌(不是在 FB 上创建测试应用后生成的那个)。

我的解决方案是从模拟器中删除应用程序并再次运行它。

【讨论】:

以上是关于IOS Parses PF Login ViewController在通过Facebook登录时没有调用LoginUser Delegate,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在iOS中将触摸传递给手势识别器?

A C compiler that parses this code will contain at least the following symbol table entries

同时切换 Tabs 和重置 Nav 的 View Controllers - Swift iOS

在解析服务器/iOS 上以安全的方式集成 LinkedIn 登录

iOS学习03

iOS学习03