如何在移动 android/iOs(本机应用程序)中关闭 webview

Posted

技术标签:

【中文标题】如何在移动 android/iOs(本机应用程序)中关闭 webview【英文标题】:How to close webview in mobile android/iOs(Native app) 【发布时间】:2018-04-26 05:09:24 【问题描述】:

在我们的应用中,如果在 webview 中打开一个 url,则可以在检测到某些特定 url 后关闭 webview。 怎么可能关闭 webview ?我在 javascript 中尝试使用 window.close()。但无法正常工作。从 androidios 应用程序有另一种方式。

【问题讨论】:

您可以简单地设置该网页视图的可见性。 原生还是混合?哪种技术? 原生安卓::wbview.removeAllViews(); wbview.destroy(); 原生应用有问题 关闭网页视图是指从网页视图屏幕导航回上一个屏幕吗? 【参考方案1】:

根据 cmets 的问题,我为关闭 Web 视图添加了一个更好的术语 - 返回上一个屏幕。对于 Android 和 iOS,您可以按以下方式执行此操作:

安卓:

finish()  

iOS:

如果您使用的是导航控制器:

self.navigationController?.popViewController(animated: true)  

如果您正在展示 Web 视图控制器:

self.dismiss(animated: true, completion: nil)  

关键是在 web 视图的委托函数中检查该 url。

安卓:

    public boolean shouldOverrideUrlLoading(WebView view, String url) 
        if (url.equals("your_url")) 
            finish()
            return false;
         else 
            return true;
        
      

iOS:

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool 
        if request.url?.absoluteString == "your_url" 
            self.navigationController?.popViewController(animated: true)
            // If controller is presented -  self.dismiss(animated: true, completion: nil)  
            return false
        

        return true
    

【讨论】:

【参考方案2】:

您可以使用shouldOverrideUrlLoading

当一个新的 url 即将被加载到当前的WebView 中时,让宿主应用程序有机会接管控制权。如果未提供WebViewClient,默认情况下WebView 将要求活动管理器为url 选择正确的处理程序。如果提供了WebViewClient,则return true 表示主机应用程序处理url,而return false 表示当前WebView 处理url。

注意事项:

使用POST“方法”的请求不会调用此方法。 此方法也适用于非http方案的子帧,因此强烈不建议在方法内部使用请求的url无条件调用loadUrl(String)然后返回true,因为这会使WebView尝试加载非 http url,因此失败。

这里是示例演示

public class MainActivity extends AppCompatActivity 

    WebView myWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myWebView = findViewById(R.id.myWebView);
        myWebView.setWebViewClient(new MyWebViewClient());
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.loadUrl("https://***.com/users/7666442/nilesh-rathod?tab=topactivity");

    


    public class MyWebViewClient extends WebViewClient 
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) 
            if (url.equals("https://***.com/users/7666442/nilesh-rathod?tab=profile")) 

                finish() ;
                Toast.makeText(MainActivity.this, "URL DETECTED", Toast.LENGTH_SHORT).show();
                // perform your action here
                return true;
             else 
                view.loadUrl(url);
                return true;
            
        
    



【讨论】:

OP在问题cmets中已经提到他想去上一个屏幕。 @Nitish 谢谢我已经更新了我的 BTW 我还添加了评论以按照我的回答中的要求执行他所需的操作,请再次检查 @nilesh 这里需要创建自定义 webview?(根据我的 android 开发人员所说) @BhaveshChauhan 无需创建自定义 webview 只需创建新的自定义 WebViewClient 与我的回答相同,它会正常工作【参考方案3】:

在 iOS 中,您现在将使用 Safari sfview,因此出于安全考虑,直接获取 URL 会被阻止,因此您可以在 Android 和 iOS 应用程序中应用的唯一通用解决方案是深度链接。

当您使用深层链接到达该特定 URL 时,您可以触发关闭 safari sf 视图。

Google 深层链接并按照示例进行操作。

【讨论】:

【参考方案4】:

使用它可以帮助你

  myWebView.destroy();
  myWebView = null;

【讨论】:

以上是关于如何在移动 android/iOs(本机应用程序)中关闭 webview的主要内容,如果未能解决你的问题,请参考以下文章

跨平台移动订阅(Android + iOS)[关闭]

我如何测试我的 xpath 已在 android/iOS 本机应用程序上识别出正确的元素

如何从颤动中正确调用android本机代码(android/IOS)?

在 Native App Container (Android, IOS) 中为混合应用加载外部内容

本机应用程序到服务器通信

从 android/ios 使用 Symfony 进行身份验证