我已经从旧的Facebook SDK到新的Facebook SDK 3.1将我的应用程序,以使用iOS6的本地功能以及其他Facebook的功能,并且我有这种情况发生始终在模拟器上,很少设备上的问题。
当我登录到Facebook上的应用程序backgrounding而不是通过Safari或Facebook的应用程序验证,我得到我的应用程序之上的模态窗口的登录(我相信这开始与iOS6的,即使在切换至Facebook SDK 3.0之前/3.1)。 这个窗口让我输入用户名和密码,但是当我去验证右上角点击“好”,什么都不会发生。 没有发生回调到应用程序:的OpenURL:sourceApplication:注释:在AppDelegate中。
在我的共享FacebookController代码(我在多个项目),我尝试初始化授权按照Facebook的样例代码时FBSession:
FBSession *session = [[FBSession alloc] initWithAppID:nil permissions:readPermissions defaultAudience:FBSessionDefaultAudienceNone urlSchemeSuffix:self.fbUrlSchemeSuffix tokenCacheStrategy:nil];
if(session.state == FBSessionStateCreated || session.state == FBSessionStateCreatedTokenLoaded)
{
[FBSession setActiveSession:session];
// we open after the fact, in order to avoid overlapping close
// and open handler calls for blocks
[session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
...
除非我点击X取消该对话框上的按钮永远不会执行的完成处理程序的代码(在这种情况下,我得到预期的错误)。
我设置了FacebookAppID在我的iOS目标属性(info.plist中),我有一个设置了FB ### [url_scheme_suffix]以及该URL方案。
我有我的代码和Facebook的样例代码之间唯一的区别是,我使用URL方案的后缀,因为我有我们的应用程序的免费和付费版本。
如果应用程序使用Safari浏览器登录,它与代码工作给出。 如果快速切换到Facebook的应用程序,它也适用。 此外,Facebook的共享帐号iOS6的工作设置。 该应用程序只有在使用中的应用程序模式的失败。
有人遇到过这种情况么?
同样的事情发生在我身上。 它只发生在模拟器(iPhone5的4英寸,iOS6的),所以我不知道这个问题会出现在实际的设备。
一对夫妇调试会话后,我发现FBDialog的web视图:shouldStartLoadWithRequest:navigationType:方法不处理这是承载着一个的access_token URL。 当Facebook传递的access_token,这意味着你的身份验证。 所以,我算了一下,有东西丢失在那里。
这里是一个没有被处理的URL的形状:
fb122222222222222://授权/#= 的access_token ...&expires_in = 5102464& 代码 = ...
需要注意的是URL方案是你已经在你的应用程序的Info.plist文件配置的相同FB + API密钥。
以下是我为了解决这个问题做了 。 请注意,我添加了一个新否则,如果分公司,我称之为对话成功情况下,我们的访问令牌:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
NSURL* url = request.URL;
if ([url.scheme isEqualToString:@"fbconnect"]) {
if ([[url.resourceSpecifier substringToIndex:8] isEqualToString:@"//cancel"]) {
NSString * errorCode = [self getStringFromUrl:[url absoluteString] needle:@"error_code="];
NSString * errorStr = [self getStringFromUrl:[url absoluteString] needle:@"error_msg="];
if (errorCode) {
NSDictionary * errorData = [NSDictionary dictionaryWithObject:errorStr forKey:@"error_msg"];
NSError * error = [NSError errorWithDomain:@"facebookErrDomain"
code:[errorCode intValue]
userInfo:errorData];
[self dismissWithError:error animated:YES];
} else {
[self dialogDidCancel:url];
}
} else {
if (_frictionlessSettings.enabled) {
[self dialogSuccessHandleFrictionlessResponses:url];
}
[self dialogDidSucceed:url];
}
return NO;
}
//THIS IS WHAT I'VE ADDED>>>>
else if ([[[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleURLTypes"] firstObject] objectForKey:@"CFBundleURLSchemes"] firstObject] isEqual:url.scheme])
{
[self dialogDidSucceed:url];
return NO;
}
//<<<<<
else if ([_loadingURL isEqual:url]) {
return YES;
} else if (navigationType == UIWebViewNavigationTypeLinkClicked) {
if ([_delegate respondsToSelector:@selector(dialog:shouldOpenURLInExternalBrowser:)]) {
if (![_delegate dialog:self shouldOpenURLInExternalBrowser:url]) {
return NO;
}
}
[[UIApplication sharedApplication] openURL:request.URL];
return NO;
} else {
return YES;
}
}
我是值得一提的是,我下面所有的FB SDK指南(3.1),我还没有作出了SRC代码进行任何进一步的修改。
有了这些变化,FB登录过程按预期工作。
我希望这有帮助!