如何将现有站点打包为APP?WebView内点击发送验证码无响应如何解决?
修复步骤
1. 补充缺失的WebView核心配置
你当前只开启了JavaScript权限,大部分现代站点依赖的其他权限没有开启,需要在WebSettings配置块补充以下代码:
// 开启DOM存储,站点的前端临时数据(比如会话状态、提交缓存)依赖该配置 webSettings.setDomStorageEnabled(true); // 允许混合内容,避免HTTPS站点内加载HTTP资源时被默认拦截 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // 允许JS弹出窗口,部分站点发送验证码前的确认提示需要该配置 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // 补充WebChromeClient配置,处理前端交互逻辑 myWebView.setWebChromeClient(new WebChromeClient());
2. 检查自定义WebViewClient逻辑
你代码中重复设置了两次WebViewClient,最终生效的是TutorialWebViewClient,请检查该类中重写的shouldOverrideUrlLoading方法:
- 不要拦截站点的POST请求,发送验证码的提交行为一般是POST请求,被拦截后就会无响应
- 不要在重写该方法时默认返回true,返回true代表你已经处理了该请求,WebView不会继续加载
3. 检查AndroidManifest权限配置
确保你已经在Manifest文件中添加了必要配置:
<!-- 基础网络权限,必须添加 --> <uses-permission android:name="android.permission.INTERNET" /> <application ... <!-- Android 9及以上允许明文流量,避免站点HTTP请求被拦截 --> android:usesCleartextTraffic="true" ...>
修复后完整参考代码
public class MainActivity extends ActionBarActivity { private WebView myWebView; private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myWebView = (WebView) findViewById(R.id.activity_main_webview); WebSettings webSettings = myWebView.getSettings(); // 原有JS权限配置 webSettings.setJavaScriptEnabled(true); // 补充配置开始 webSettings.setDomStorageEnabled(true); webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); myWebView.setWebChromeClient(new WebChromeClient()); // 补充配置结束 myWebView.loadUrl("https://app.my30t.ir/login"); // 删除重复的WebViewClient配置,只保留自定义的即可 myWebView.setWebViewClient(new TutorialWebViewClient()); editText = (EditText) findViewById(R.id.editText); editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { boolean handled = false; if(actionId == EditorInfo.IME_ACTION_SEND) { myWebView.loadUrl(editText.getText().toString()); handled = true; } return handled; } }); } }
排查小技巧
如果修改后还是异常,可以开启WebView调试模式,在Chrome浏览器输入chrome://inspect连接设备查看前端控制台报错,定位具体问题:
// 开启WebView调试,仅测试环境开启 WebView.setWebContentsDebuggingEnabled(true);
内容的提问来源于stack exchange,提问作者Soroush Ebrahimi
相关产品推荐
相关产品推荐

