Facebook JavaScript登录在本地iOS6 UIWebView中(在Safari上有效)

3
我正在寻找一个关于在本地iOS 6应用程序中使用UIWebView运行FB.login()的解决方案。我已经进行了大量调试,但还没有找到解决方案。
问题是:当调用fb.login时,我的应用程序会打开一个新的UIWebView来处理它(就像Safari打开一个新的标签页)。Facebook登录出现了,但当它登录时,一个空白页面出现了,什么也没有发生(在根UIWebView中也是如此)...有人知道完成fb.login js流程的解决方案吗?
谢谢大家!
附注: 无帮助的链接--

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

1个回答

0

搞定了!

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

怎么做到的?这是一个纯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响应

Objective 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登录对话框中的用户操作。

如果我回答得太快,请问我!希望能帮到你。


2
这对于登录和社交插件评论同样适用。但是,对于在其注册过程中使用Facebook登录的网站,这并不能解决问题,因为您将重定向到空页面而不是在Facebook应用程序中设置的重定向URL上返回前一页。 - Pushpak Narasimhan
你必须从此链接获取信息:https://dev59.com/bHTYa4cB1Zd3GeqP0Oqo#22167103 - Muralikrishna
嗨@pinthor,[self backToLastPage]具体是做什么的? - baquiax
@baquiax,老兄,这个是在 iOS 6 上(将近3年前)就有了。据我所记,这个函数只是从浏览器中调用 history.back()。 - owlmsj
@pinthor 我知道了,只是有疑问。 :) - baquiax
@pinthor:backToLastPage不再起作用了,对吧? - rAzOr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接