IOS解析PFLoginViewController didLogiUser Delegate在通过Facebook登录



这是一个非常奇怪的问题,因为在我更新到Xcode 6和iOS 8之前,我的Facebook登录一直在工作。更奇怪的是,推特运行得很好,但脸书没有调用didLogin回调。

以下是我在AppDelegate中所做的:

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

然后我设置了Facebook&application:didFinishLaunchingWithOptions: 中的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。如果用户点击推特按钮,他将毫无问题地登录。然而,如果点击Facebook按钮,Facebook确认屏幕就会出现,我点击ok,然后它会返回到我的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中实现委托,以及更新Parse/Facebook SDK。

我认为这个问题可能与打开另一个应用程序有关,比如Facebook或safari。我倾向于这样做的原因是,推特屏幕是一个模式弹出的视图,它可以毫无问题地工作。当脸书给我这个错误时,它不会切换到safari或脸书应用程序,而是显示一个模式弹出的登录信息,并且运行良好。这让我相信这个问题与切换应用程序和没有正确接收回调有关。

我还有第三个登录选项,我忽略了它。第三种选择只需在没有社交媒体账户的情况下注册即可,这也很有效。

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

事实证明,我无意中删除了这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;

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

对我来说,解决方案是从模拟器中删除应用程序,然后重新运行。

最新更新