我有一个即将完成的应用程序,我们决定允许用户使用 Facebook 登录。
在过去的某个时候,这个功能是有效的,现在它只是挂起。
我包含了最新的 Parse SDK (1.6.1) 和最新的 Facebook SDK (3.21.1)。
我想我已经正确设置了应用程序。以下是我正在调用的电话:
// AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[Parse setApplicationId:@"appId" clientKey:@"clientKey"];
[PFFacebookUtils initializeFacebook];
return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[FBAppCall handleDidBecomeActiveWithSession:[PFFacebookUtils session]];
}
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
[[PFFacebookUtils session] close];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication withSession:[PFFacebookUtils session]];
}
// Login View Controller
- (void)loginWithFacebok {
[PFFacebookUtils logInWithPermissions:@[@"public_profile", @"email"] block:^(PFUser *user, NSError *error) {
if (error != nil) {
// Error handling here.
} else {
if (user == nil) {
// Something odd happened; error handling here.
} else {
// A further Facebook method...
[self authorizeFacebookPublish];
}
}
}];
}
基本上,虽然它以前是工作的,但从 block
从未被调用的意义上说,它现在是非功能性的。我确实让“应用程序跳转”到 Facebook 应用程序/网页(现在不记得是哪个了,它“跳转”来回的速度太快了,我无法分辨,因为我已经批准了这在过去)。有趣的是,如果我强制退出该应用程序(该应用程序基本上处于“挂起”状态)并重新启动该应用程序,该应用程序将加载并且用户已登录。
这是一个相当重要的观点,但我找不到其他人有这个特定问题。
我看到了this question ,但我们没有使用 Twitter。
This question与 Parse 无关。
编辑: 我正在努力解决这个问题,并且一直对断点捕获感到困惑。例如,在我的
-loginWithFacebook
方法中,我在第一行(loginWithPermissions
调用)和 返回的第一行放置了一个断点block (if (error != nil) {...
,第一个断点每次都会被命中两次。我终于想尝试一些新的东西,所以我添加了第一行上方的 NSLog
行,并将第一个断点移到那里。后续运行的第一个断点(现在在 NSLog
上)命中一次,然后 block 的第一行命中第二。因此,我能够确定我的问题是不是,事实上,在我的loginWithFacebook
方法中。它在我的authorizeFacebookPublish
方法中。这是代码:
- (void)authorizeFacebookPublish {
NSLog(@"authorizing for Facebook publish..."); // First breakpoint here...
[PFFacebookUtils reauthorizeUser:[PFUser currentUser]
withPublishPermissions:@[@"publish_actions"]
audience:FBSessionDefaultAudienceFriends
block:^(BOOL succeeded, NSError *error) {
if (error != nil) { // Second breakpoint here...
// Error handling...
} else {
if (succeeded == YES) {
// Our app now has publishing permissions for the user
[PFUser currentUser][@"canPublishToFacebook"] = @(YES);
} else {
// Our app was refused publishing permissions
[PFUser currentUser][@"canPublishToFacebook"] = @(NO);
[[PFUser currentUser] saveInBackground];
}
// Log in was successful, so do other stuff....
}
}];
}
我现在看到了同样列出的问题 here ,这是某个断点(显然每次都被命名为“断点 2.1”)。然而,这个人并没有报告我所看到的相同问题,即返回 block 永远不会触发。因此,我得出结论,授权(或重新授权) block 中存在一些问题。
正如我上面提到的,这段代码在过去的某个时候是有效的。 “重新授权”是否可能导致错误?我有没有办法检查用户过去是否已经授权我的应用程序并跳过授权过程(因为它已经完成)?如果这是问题,那么在注销后让用户重新登录的正确程序是什么(使用 Facebook)?
最佳答案
首先,为什么要在 applicationWillTerminate:
回调中调用 [[PFFacebookUtils session] close]
?
Facebook session 使用存储在磁盘上的 token ,这意味着 session 在应用程序启动期间保持打开状态,并且在应用程序终止时没有理由关闭。
如果你想注销用户,你应该调用 [PFUser logOut]
然后 [[PFFFacebookUtils session] close]
或更好的 [[PFFFacebookUtils session] closeAndClearTokenInformation]
(但我不确定这是否必要)。
如果您不想注销用户(我认为这样更好),就不要调用任何东西。
其次,我在过去使用 [PFFFacebookUtils reauthorizeUser: ...]
时也遇到过很多问题。我发现的一种解决方法是直接使用 Facebook API:
[[PFFacebookUtils session] requestNewPublishPermissions:[NSArray arrayWithObject:@"publish_actions"] defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *session, NSError *error) {
if (!error) {
if ([[PFFacebookUtils session].permissions indexOfObject:@"publish_actions"] == NSNotFound) {
// Permission not granted, tell the user we will not share to Facebook
NSLog(@"Permission not granted, we will not share to Facebook.");
} else {
// Permission granted.
}
} else {
// An error occurred. See: https://developers.facebook.com/docs/ios/errors
NSLog(@"Error : Requesting \"publish_actions\" permission failed with error : %@", error);
}
}];
它做的事情完全一样,但似乎效果更好。
此外,关于您的多断点问题,如果您将断点放在 block 的开头,它通常会停止两次:创建 block 时和调用 block 时。虽然该 block 仅被调用一次,但您可以像您一样使用 NSLog(...)
调用来检查。
关于ios - Parse.com Facebook 授权从不调用完成处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27714369/