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 上工作)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iPhone 上从 Facebook 注销(本机/集成)
Facebook 请求配置文件 Graph API 无法在 iOS 7 本机 facebook 上未登录
无法使用 iOS SDK 和本机 Facebook 应用程序对 Facebook 进行身份验证