Pet*_*len 6 facebook facebook-ios-sdk ios6
我一直在将我的应用程序从旧的Facebook SDK转换为新的Facebook SDK 3.1,以便使用iOS6本机功能以及其他Facebook功能,我遇到的问题是在模拟器上一直发生而很少在设备上发生.
当我登录Facebook,而不是应用程序后台和通过Safari或Facebook应用程序进行身份验证时,我在我的应用程序顶部获得了一个用于登录的模态窗口(我相信这开始于iOS6,甚至在切换到Facebook SDK 3.0之前/3.1).这个窗口允许我输入用户名和密码,但当我点击右上角的"Okay"进行身份验证时,没有任何反应.应用程序没有回调:openURL:sourceApplication:annotation:在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) {
...
Run Code Online (Sandbox Code Playgroud)
除非我单击对话框上的x cancel按钮,否则永远不会执行完成处理程序的代码(在这种情况下,我会收到预期的错误).
我在我的iOS目标属性(info.plist)中设置了FacebookAppID,并且我还使用fb ### [url_scheme_suffix]设置了URL Schemes.
我的代码和Facebook示例代码之间的唯一区别是我使用url scheme后缀,因为我有一个免费和付费版本的应用程序.
如果应用程序使用Safari登录,它将使用给定的代码.如果它快速切换到Facebook应用程序,它也有效.此外,共享的Facebook ios6帐户设置工作.该应用程序仅在使用in app模式时才会失败.
有人遇到过这种情况么?
同样的事情也发生在我身上。仅出现在模拟器上(iphone5 4英寸,ios6),所以不知道实际设备中是否会出现这个问题。
经过几次调试会话后,我发现 FBDialog 的 webView:shouldStartLoadWithRequest:navigationType: 方法未处理携带 access_token 的 url。当facebook传递access_token时,就意味着你已经通过了身份验证。所以,我想,那里缺少了一些东西。
以下是未处理的 url 的形状:
fb122222222222222 ://authorize/# access_token =...& expires_in =5102464&代码=...
请注意,url 方案与您在应用程序的 Info.plist 文件中配置的 fb+API 密钥相同。
以下是我为解决此问题所做的操作。请注意,我添加了一个新的 else-if 分支,如果我们拥有访问令牌,我将在其中调用对话框成功:
- (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;
}
}
Run Code Online (Sandbox Code Playgroud)
值得一提的是,我遵循所有 fb sdk 指南 (3.1),并且没有对 src 代码进行任何进一步的更改。
通过这些更改,fb 登录过程将按预期工作。
我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
1920 次 |
| 最近记录: |