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

标签 facebook ios5 oauth ios6 facebook-login

我们有:
(1) 具有 Facebook OAuth 功能的基于 Facebook API 的网络应用程序(“FB 网络应用程序”)
(2) iPad 上基于 UIWebView 的浏览器(“浏览器”)

我们的目标是在 iPad 上基于 UIWebView 的浏览器 (2) 中打开 Facebook 登录页面以登录 FB 网络应用程序 (1)。

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

但是,当用户在 Facebook 表单中输入登录名和密码后,就会出现该问题。我们的问题是我们无法首先显示 Facebook 登录表单。按照该问题中的建议,将应用程序类型从“Web”更改为“Native/Desktop”,但没有帮助。

步骤:
1. 用这个UIWebView浏览器
打开我们的网页(简单的HTML页面) 2. 点击本页的“FB web app”启动按钮
3. OnClick JavaScript 尝试启动 OAuth,它应该打开 Facebook 的登录屏幕以登录到 FB web 应用程序

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

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

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

更多技术细节:

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

-(BOOL)webView(UIWebView*)webView shouldStartLoadWithRequest(NSURLREquest*)request navigationType:…   

我们注意到“正确”和“不正确”行为的日志中存在一些差异。以下是我的执行流程:

首先,我按下“FB Web App”启动按钮来启动OAuth,然后一些情况就开始了

iOS 4.3,“正确”
请求 www.facebook.com/dialog/oauth?...
请求到 fbwebapp.com
请求 m.facebook.com/login.php?....
--这里出现facebook登录

iOS 5.0,“不正确1”
请求 www.facebook.com/dialog/oauth?...
请求到 fbwebapp.com
向 m.facebook.com/login.php 请求?...

那么可能是
-- 很多 m.facebook.com/login.php?...在​​参数中有下一个...
其次是sqlite错误
--现在我看到来自 facebook 的“抱歉,出了点问题”页面(这是我第一次遇到它)

iOS 6.0“不正确2”
请求 www.facebook.com/dialog/oauth?...
向 fbwebapp.com 请求

-(void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error is invoked with error code -999

您可以看到该行为肯定取决于 iOS 版本。但常见的情况是错误发生在获取m.facebook.com/login.php.. URL 的步骤。但这就是我们所能检测到的全部。

我们整天都在用头撞墙寻找解决方案。无奈。
你能帮助我们在 UIWebView 中打开 Facebook 登录页面以响应 OAuth 吗?

最佳答案

只需使用:这段代码

if (![FBSDKAccessToken currentAccessToken]) 
{   
    FBSDKLoginManager *manager = [[FBSDKLoginManager alloc]init];
    manager.loginBehavior = FBSDKLoginBehaviorWeb;
    [manager logInWithReadPermissions:@[@"public_profile", @"email", @"user_friends"] handler:
     ^(FBSDKLoginManagerLoginResult *result, NSError *error) {

         NSLog(@"result.token: %@",result.token.tokenString);  
         NSLog(@"%@",result.token.userID);   
         NSLog(@"%hhd",result.isCancelled);     
     }];
}

//此处 manager.loginBehavior = FBSDKLoginBehaviorWeb; 是您在 UIWebview 中打开 facebook 所需的全部内容

关于facebook - 如何让 UIWebView 打开 Facebook 登录页面以响应 iOS 5 和 iOS 6 上的 OAuth 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13313225/

相关文章:

iphone - 如何使用iOS SDK修剪视频文件并转换为15秒视频?

html - 使用 webkit-overflow-scrolling 时 iOS 文本和图像模糊 : touch

authentication - 什么最适合与 CLI 工具的身份验证服务器交互?

facebook - 剪影休息种子 : how to use a social provider?

php - 为什么在IE中使用XFBML注册插件会出现空白?

iOS:如何将UIView的自绘内容转换为图像(广泛的通用解决方案返回空白图像)?

php - 从客户端使用 oauthtoken 从我服务器上的 gdrive 下载文件

facebook - 如何添加 "integration flow for an end user to connect their Instagram business account(s)"- FB Graph API (For IG) 问题

iphone - iOS 6 - Facebook 共享程序失败并出现错误 "The proxied app is not already installed"

python - 使用 Python 访问 Lovoo API