【发布时间】:2014-12-31 00:00:21
【问题描述】:
我的应用程序即将完成,我们决定允许用户使用 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 行并将第一个断点移到那里。随后的运行有第一个断点(现在在@ 987654330@) 命中一次,然后块的第一行命中第二次。因此,我能够确定我的问题是不是,实际上是在我的loginWithFacebook方法中。它在我的@ 987654332@ 方法。代码如下:
- (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”)。然而,这个人并没有报告我看到的同样的问题,即返回块永远不会触发。因此,我的结论是授权(或者可能是重新授权)块中存在一些问题。
正如我上面提到的,这段代码在过去的某个时候工作过。 “重新授权”是否可能导致错误?有没有办法让我检查用户过去是否已经授权我的应用程序并跳过授权过程(因为它已经完成了)?如果这是问题,那么在用户注销后(使用 Facebook)重新登录的正确程序是什么?
【问题讨论】:
-
你确定完成块没有运行吗?如果您注释掉“[self authorizeFacebookPublish];”会发生什么?
-
您是否从委托中的 handleOpenURL 返回 YES?我想你做到了。
-
@LyndseyScott 我在完成块的第一行有一个断点。我的代码再也不会到达
[self authorizeFacebookPublish]。 -
@Harry 是的。或者至少,我认为
return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication withSession:[PFFacebookUtils session]];就是这样做的。正如我在帖子中提到的,该应用程序确实会从 Facebook 的应用程序/网页返回和返回,所以我不认为这就是问题所在。 -
尝试在
if(error != nil)行之前记录 user 和 error 的值并告诉我。
标签: ios facebook parse-platform