我的应用即将完成,我们决定允许用户使用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
调用)上放置了一个断点,在返回的块的第一行(if (error != nil) {...
,第一个断点每次都会被击中两次。我终于想到尝试新的东西了,所以我在第一行上方添加了NSLog
行,并在那里移动了第一个断点。后续运行让第一个断点(现在在NSLog
上)点击一次,然后块的第一行击中第二个。因此,我能够确定我的问题是不,事实上,我的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”每次都被击中)。然而,这个人并没有报告我遇到的同样问题,即返回块永远不会被触发。因此,我的结论是授权(或可能是重新授权)块存在一些问题。
正如我上面提到的,这段代码在过去的某个时刻正在发挥作用。 “重新授权”是否可能导致错误?有没有办法让我检查用户过去是否已经授权我的应用程序并跳过授权过程(因为它已经完成)?如果 IS 问题,在注销后使用Facebook将用户重新登录的正确程序是什么?
答案 0 :(得分:1)
首先,您为什么在[[PFFacebookUtils session] close]
回调中呼叫applicationWillTerminate:
?
Facebook会话使用存储在磁盘上的令牌,这意味着会话在应用程序启动时保持打开状态,并且在应用程序终止时没有理由关闭。
如果您想要退出用户,请拨打[PFUser logOut]
然后[[PFFacebookUtils session] close]
或更好[[PFFacebookUtils session] closeAndClearTokenInformation]
(但我不确定这是否必要)。
如果您不想将用户注销(我认为更好),请不要打电话。
其次,过去[PFFacebookUtils 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);
}
}];
它完全相同,但似乎工作得更好。
此外,关于多个断点问题,如果在块的开头放置一个断点,它通常会停止两次:创建块时和调用块时。该块只会被调用一次,您可以通过NSLog(...)
调用来检查该块。