Android WebView集成Facebook登录报错:Unsafe JavaScript导航问题
兄弟,我之前也踩过Android WebView集成Facebook登录的大坑,你遇到的这个Unsafe JavaScript导航错误,本质是WebView的跨域安全限制和Facebook OAuth流程的适配问题,给你几个针对性的解决思路,亲测有效:
解决Android WebView中Facebook登录的跨域导航错误
1. 先把WebView的基础配置拉满
很多人栽在基础设置不全上,先确保这几个开关都打开:
- 必须开启JavaScript:
webSettings.setJavaScriptEnabled(true); - 开启DOM存储(Facebook登录依赖这个存会话):
webSettings.setDomStorageEnabled(true); - 允许跨域资源访问:
webSettings.setAllowUniversalAccessFromFileURLs(true); - 针对Android 7+,处理混合内容(如果你的站点是HTTP,Facebook是HTTPS,必须开这个):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); }
2. 正确拦截OAuth跳转,别乱拦!
Facebook登录会跳转到oauth授权页,再跳回你的回调URL,这一步绝对不能把Facebook的域名跳转也拦截了!正确的做法是在WebViewClient的shouldOverrideUrlLoading里只拦截自己的回调URL:
@Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); // 替换成你自己的Facebook回调URL前缀 if (url.startsWith("http://www.example.com/callback/")) { // 这里处理登录成功后的逻辑,比如提取授权码 handleFacebookLoginCallback(url); return true; } // Facebook相关的域名,让WebView正常加载,别拦截! if (url.contains("facebook.com") || url.contains("fbcdn.net")) { view.loadUrl(url); return false; } return super.shouldOverrideUrlLoading(view, request); }
你之前的错误就是因为WebView拦截了Facebook的oauth页面跳转,触发了跨域安全限制,浏览器认为是不安全的JS导航。
3. 检查Facebook开发者后台的配置,别漏了关键项
这步90%的人都容易忽略:
- 签名哈希必须正确:用Facebook提供的工具生成你当前打包用的签名哈希,在开发者后台的Android平台设置里填写,测试包和正式包的签名哈希是不一样的!
- redirect_uri完全匹配:后台设置的回调URL要和WebView里用的完全一致,包括HTTP/HTTPS、域名、路径,差一个字符都不行
- 确保你的应用状态是“公开”,或者你已经把自己添加为测试用户
4. 捕获完整的JS错误日志
你贴的错误日志没显示全,建议用WebChromeClient捕获完整的控制台错误,方便排查:
webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { Log.d("WebViewJSLog", consoleMessage.message() + " 行号:" + consoleMessage.lineNumber() + " 来源:" + consoleMessage.sourceId()); return super.onConsoleMessage(consoleMessage); } });
通过完整的日志,你能快速定位是回调URL不匹配、签名错误还是其他问题。
内容的提问来源于stack exchange,提问作者user1944429
相关产品推荐
相关产品推荐

