这是一个非常奇怪的问题,因为我的 Facebook 登录在我更新到 Xcode 6 和 iOS 8 之前就可以工作。为了让这更奇怪,Twitter 工作得很好,但 Facebook 没有调用 didLogin 回调。
这是我在 AppDelegate 中所做的事情:
@interface AppDelegate : UIResponder <UIApplicationDelegate, NSURLConnectionDataDelegate, UITabBarControllerDelegate, PFLogInViewControllerDelegate, PFSignUpViewControllerDelegate>
然后我设置 Facebook 和 Twitterapplication: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];
在viewDidAppear我的ConfigViewController我做以下检查:
// 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 调用?
任何帮助是极大的赞赏!
[编辑]
经过大量测试和许多令人头疼的问题,这是最新的。
URL Schemes如果我在我的 Info.plist 中搞砸了,它就可以工作。我将名称从更改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为我指明了正确的方向。