如何让UIWebView打开Facebook登录页面以响应iOS 5和iOS 6上的OAuth请求?

use*_*802 6 facebook oauth ios5 facebook-login ios6

我们有:
(1)基于Facebook API的Web应用程序,具有Facebook OAuth功能("FB web app")
(2)UIWebView基于iPad的浏览器("浏览器")

我们的目标是打开Facebook登录页面以登录iPad上基于UIWebView的浏览器(2)内的FB Web应用程序(1).

这里有一个类似的问题:http:
//facebook.stackoverflow.com/questions/11337285/no-longer-able-to-login-to-ios-app-via-oauth-the-page-requested-was-未找到

但是,在用户在Facebook表单中输入登录名和密码后,就会出现问题.我们的问题是我们无法首先显示Facebook登录表单.正如该问题中所建议的那样,将应用类型从"Web"更改为"Native/Desktop"并没有帮助.

步骤:
1.使用此UIWebView浏览器打开我们的网页(简单的HTML页面)
2.单击此页面上的"FB web app"启动按钮
3. OnClick JavaScript尝试启动OAuth,这将打开Facebook的登录屏幕以登录到FB网络应用程序

当前结果(问题):
在iOS 5. +和iOS 6. +设备
- 我们的网页保持不变
- Facebook登录页面未显示(我们的网页仍然显示)
在iOS 4.3(按预期工作):
- Facebook登录页面UIWebView在浏览器的同一对象中打开(替换我们的网页)

预期结果:
- 显示Facebook登录页面,用户可以输入Facebook登录名和密码
- 在iOS 5. +和iOS 6. +上工作,如果在iPad上的Safari浏览器中启动.Facebook登录页面在单独的选项卡中打开(相比之下,没有单独的选项卡UIWebView)

问题:如何UIWebView在iOS 5+和iOS 6+上响应OAuth请求打开Facebook登录页面?

更多技术细节:

我们NSURLRequest从内部记录不同的字段

-(BOOL)webView(UIWebView*)webView shouldStartLoadWithRequest(NSURLREquest*)request navigationType:…   
Run Code Online (Sandbox Code Playgroud)

我们注意到"正确"和"不正确"行为的日志存在一些差异.这里执行流程如何看待我:

首先,我按"FB Web App"启动按钮启动OAuth,然后有些情况下去了

iOS 4.3,"正确"
请求www.facebook.com/dialog/oauth?...
请求fbwebapp.com
请求m.facebook.com/login.php?.... -
其中facebook登录出现

iOS 5.0,"incorrect1"
请求www.facebook.com/dialog/oauth?...
请求fbwebapp.com
请求m.facebook.com/login.php?...

然后它可能是 -
很多m.facebook.com/login.php?...with next ...在参数
后面跟着sqlite错误 -
现在我看到facebook上的"抱歉,出了问题"页面(这是一个我第一次遇到它)

iOS 6.0" wrong2 "
请求www.facebook.com/dialog/oauth?...
请求fbwebapp.com

- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)错误被调用,错误代码为-999

你可以看到这种行为肯定取决于iOS版本.但常见的情况是在获取m.facebook.com/login.php .. URL的步骤中发生错误.但这就是我们能够发现的一切.

我们正在全力以赴地寻找解决方案.绝望.
您能否帮助我们UIWebView在响应OAuth时打开Facebook登录页面?

小智 0

使用 FBDialog 类提示用户登录。这使用应用程序内部的 webview,因此成功登录后,用户将在任何 UIWebView 内部登录:

NSString *kRedirectURL  = @"fbconnect://success";
NSString *kSDK = @"ios" ;
NSString *kLogin = @"oauth";
NSString *kDialogBaseURL = @"https://m.facebook.com/dialog/";

NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                               AE_FACEBOOK_APPID, @"client_id",
                               @"user_agent", @"type",
                               kRedirectURL, @"redirect_uri",
                               @"touch", @"display",
                               kSDK, @"sdk",
                               nil];

NSString *loginDialogURL = [kDialogBaseURL stringByAppendingString:kLogin];

FBLoginDialog* loginDialog = [[FBLoginDialog alloc] initWithURL:loginDialogURL
                                                    loginParams:params
                                                       delegate:self];
[loginDialog show];
Run Code Online (Sandbox Code Playgroud)

然后使您的类遵守 FBDialogDelegate 协议,并将此函数添加到您的类中:

-(void)fbDialogLogin: (NSString *)token expirationDate:(NSDate *)expirationDate{
    // Store the token and expiration date into the FB SDK
    self.facebook.accessToken = token;
    self.facebook.expirationDate = expirationDate;
    // Then persist these so the SDK picks them up on next load

    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:self.facebook.accessToken forKey:ACCESS_TOKEN_KEY];
[defaults setObject:self.facebook.expirationDate forKey:EXPIRATION_DATE_KEY];
[defaults synchronize];
}
Run Code Online (Sandbox Code Playgroud)

哈!