Facebook Javascript登录本机ios6 UIWebView(WORKS ON SAFARI)

时间:2013-07-07 00:03:34

标签: javascript facebook ios6 sdk uiwebview

我正在寻找一个关于使用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://stackoverflow.com/questions/13387272/fb-login-issue-with-ios-6

1 个答案:

答案 0 :(得分:0)

做到了!

它有点像黑客,但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登录对话框中处理用户操作。

如果我对这个答案太快了,请问我! 希望它有所帮助。