Facebook Javascript 在本机 ios6 UIWebView 中登录(在 SAFARI 上工作)

Posted

技术标签:

【中文标题】Facebook Javascript 在本机 ios6 UIWebView 中登录(在 SAFARI 上工作)【英文标题】:Facebook Javascript login in native ios6 UIWebView (WORKS ON SAFARI) 【发布时间】:2013-07-07 00:03:33 【问题描述】:

我正在寻找有关在带有 UIWebView 的本机 ios 6 应用程序上运行 FB.login() 的解决方案。我已经调试了很多,还没有找到解决方案。

问题是:当调用 fb.login 时,我的应用会打开一个新的 UIWebView 来处理它(就像 safari 打开一个新选项卡一样)。 Facebook 登录出现,但是当它登录时,出现一个空白页面并且没有任何反应(在根 UIWebView 中也没有)......有人知道完成 fb.login js 流程的解决方案吗?

谢谢大家!

PS: 没有帮助的链接--

How can I get UIWebView to open Facebook login page in response to the OAuth request on iOS 5 and iOS 6?

https://***.com/questions/13387272/fb-login-issue-with-ios-6

【问题讨论】:

【参考方案1】:

做到了!

这有点像 hack,但 iOS 6 上 UiWebView 上的 js facebook sdk 登录终于可以使用了。

如何做到这一点?是纯JS + Facebook JS SDK + UIWebView Delegate 处理函数的解决方案。

JS - 第一步)

一个登录按钮(用于连接 facebook)调用此函数示例,这将触发 Face JS 登录/oauth 对话框:

function loginWithFacebookClick()

FB.login(function(response)
    //normal browsers callback 
);


JS - 第二步)

在每次用户加载网页时(在 FB.init() 之后)添加一个 authResponseChange 监听器以捕获用户的连接状态:

FB.Event.subscribe('auth.authResponse.Change', function(response)
//UIWebView login 'callback' handler
var auth = response.authResponse;
if(auth.status == 'connected')
    //user is connected with facebook! just log him at your webapp

);

并且使用应用程序的 UIWebView 委托函数,您可以处理 facebook oauth 响应

目标 C - 第三步)

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

NSString *url = [[request URL] absoluteString];

//when user status == connected (has a access_token at facebook oauth response)
if([url hasPrefix:@"https://m.facebook.com/dialog/oauth"] && [url rangeOfString:@"access_token="].location != NSNotFound)

    [self backToLastPage];
    return NO;


return YES;


- (void)webViewDidFinishLoad:(UIWebView *)webView


NSString *url = [[webView.request URL] absoluteString];

if([url hasPrefix:@"https://m.facebook.com/dialog/oauth"])

    NSString *bodyhtml = [webView stringByEvaluatingjavascriptFromString:@"document.body.innerHTML"];

    //Facebook oauth response dead end: is a blank body and a head with a script that does 
    //nothing. But if you got back to your last page, the handler of authResponseChange
    //will catch a connected status if user did his login and auth app
    if([bodyHTML isEqualToString:@""])
    
        [self backToLastPage];
    



因此,当“重定向”用户到最后加载的页面时,第二步是在 facebook 登录对话框中处理用户操作。

如果我回答得太快了,请问我! 希望对您有所帮助。

【讨论】:

这也适用于 cmets 的登录和社交插件。但是在注册过程中使用 Facebook 登录的网站,这不会解决问题,因为您重定向到空白页面上的上一页,而不是 Facebook 应用程序中设置的重定向 url。 您必须从此链接获取信息***.com/questions/17870492/… 嗨@pinthor,到底在做什么 [self backToLastPage]? @baquiax,这是在 iOS 6 中(大约 3 年前)。我记得,这个函数只是从浏览器调用 history.back()。 :D @pinthor 我知道。这只是一个疑问。 :)

以上是关于Facebook Javascript 在本机 ios6 UIWebView 中登录(在 SAFARI 上工作)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过本机Facebook授权登录Facebook?

如何在 iPhone 上从 Facebook 注销(本机/集成)

Facebook 请求配置文件 Graph API 无法在 iOS 7 本机 facebook 上未登录

无法使用 iOS SDK 和本机 Facebook 应用程序对 Facebook 进行身份验证

Hybridauth Facebook 使用本机应用程序在移动设备上登录

ionic 2中的本机facebook登录