首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

IOS开发-在safari中打开来自webview的url链接,而不是当前的webview

在iOS开发中,如果你希望在Safari浏览器中打开来自WebView的URL链接,而不是在当前的WebView中打开,你可以使用UIApplicationopenURL:方法来实现这一功能。以下是具体的步骤和示例代码:

基础概念

  • WebView:一个可以加载和显示网页内容的视图。
  • URL Scheme:一种在iOS应用之间传递信息的方式。

相关优势

  • 用户体验:直接在Safari中打开链接可以让用户获得更一致和熟悉的浏览体验。
  • 安全性:某些外部链接可能需要在浏览器中打开以确保安全性和隐私。

类型与应用场景

  • 外部链接:当WebView中的链接指向外部网站时,通常希望在Safari中打开。
  • 特定协议:如mailto:tel:等协议链接,系统会自动在相应应用中打开。

实现方法

你可以使用UIWebViewDelegateWKNavigationDelegate中的方法来拦截URL加载请求,并决定是在当前WebView中打开还是在外部浏览器中打开。

示例代码(Swift)

代码语言:txt
复制
import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        webView = WKWebView(frame: self.view.frame)
        webView.navigationDelegate = self
        self.view.addSubview(webView)
        
        if let url = URL(string: "https://example.com") {
            let request = URLRequest(url: url)
            webView.load(request)
        }
    }

    // MARK: - WKNavigationDelegate
    
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if let url = navigationAction.request.url {
            if navigationAction.navigationType == .linkActivated {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
                decisionHandler(.cancel)
            } else {
                decisionHandler(.allow)
            }
        } else {
            decisionHandler(.allow)
        }
    }
}

遇到的问题及解决方法

问题:为什么链接没有在Safari中打开?

  • 原因:可能是decisionHandler(.cancel)没有被正确调用,或者URL检查逻辑有误。
  • 解决方法:确保在决定跳转时正确调用decisionHandler(.cancel),并且URL检查逻辑无误。

问题:如何处理特定协议的链接(如mailto:)?

  • 解决方法:可以直接使用UIApplication.shared.open(url, options: [:], completionHandler: nil)来打开这些特殊协议的链接,系统会自动处理并跳转到相应的应用。

通过上述方法,你可以有效地控制WebView中的链接是在当前WebView中打开还是在Safari中打开,从而提升用户体验和应用的安全性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Hybrid App 应用开发中 9 个必备知识点复习

; 注意: 大多数App需要支持 iOS7 以上的版本,而 WKWebView 只在 iOS8 后才能用,所以需要一个兼容性方案,既 iOS7 下用 UIWebView , iOS8 后用 WKWebView...所以与浏览器不同,App 中打开 WebView 的第一步并不是建立连接,而是启动浏览器内核。...如果你需要在 WebView 中打开链接或者你打开的页面带有 flash,获得你的 WebView 想弹出一个 dialog ,都会导致从 ApplicationContext 到 ActivityContext...开启 Safari 开发菜单 先将 iPhone 连接到 Mac,在 Mac 的 Safari 偏好设置中,开启开发菜单。...调试 APP 内的 WebView 参考文章:[《前端 WEBVIEW 指南之 IOS 调试篇》] (https://imnerd.org/ios-webview-debug.html) 在 Safari

2.7K20

Hybrid App 应用 开发中 9 个必备知识点复习(WebView 调试 等)

; 注意: 大多数App需要支持 iOS7 以上的版本,而 WKWebView 只在 iOS8 后才能用,所以需要一个兼容性方案,既 iOS7 下用 UIWebView ,iOS8 后用 WKWebView...所以与浏览器不同,App 中打开 WebView 的第一步并不是建立连接,而是启动浏览器内核。...如果你需要在 WebView 中打开链接或者你打开的页面带有 flash,获得你的 WebView 想弹出一个 dialog ,都会导致从 ApplicationContext 到 ActivityContext...开启 Safari 开发菜单 先将 iPhone 连接到 Mac,在 Mac 的 Safari 偏好设置中,开启开发菜单。...调试 APP 内的 WebView 参考文章:《前端 WEBVIEW 指南之 IOS 调试篇》 在 Safari-> 开发中,看到自己的设备以及 WebView 中网页,点击后即可开启对应页面的

3.2K00
  • Hybrid App 应用开发中 9 个必备知识点复习

    : 大多数App需要支持 iOS7 以上的版本,而 WKWebView 只在 iOS8 后才能用,所以需要一个兼容性方案,既 iOS7 下用 UIWebView , iOS8 后用 WKWebView...所以与浏览器不同,App 中打开 WebView 的第一步并不是建立连接,而是启动浏览器内核。...如果你需要在 WebView 中打开链接或者你打开的页面带有 flash,获得你的 WebView 想弹出一个 dialog ,都会导致从 ApplicationContext 到 ActivityContext...开启 Safari 开发菜单 先将 iPhone 连接到 Mac,在 Mac 的 Safari 偏好设置中,开启开发菜单。...调试 APP 内的 WebView 参考文章:[《前端 WEBVIEW 指南之 IOS 调试篇》] (https://imnerd.org/ios-webview-debug.html) 在 Safari

    2.3K30

    【Hybrid】288- Hybrid App 应用开发中 9 个必备知识点复习

    : 大多数App需要支持 iOS7 以上的版本,而 WKWebView 只在 iOS8 后才能用,所以需要一个兼容性方案,既 iOS7 下用 UIWebView , iOS8 后用 WKWebView...所以与浏览器不同,App 中打开 WebView 的第一步并不是建立连接,而是启动浏览器内核。...如果你需要在 WebView 中打开链接或者你打开的页面带有 flash,获得你的 WebView 想弹出一个 dialog ,都会导致从 ApplicationContext 到 ActivityContext...开启 Safari 开发菜单 先将 iPhone 连接到 Mac,在 Mac 的 Safari 偏好设置中,开启开发菜单。...调试 APP 内的 WebView 参考文章:[《前端 WEBVIEW 指南之 IOS 调试篇》] (https://imnerd.org/ios-webview-debug.html) 在 Safari

    2.3K20

    iOS Universal link 入门指南

    如果你的应用不支持的话,则会在Safari中打开该链接。...使用Universal Link(通用链接)可以让用户在Safari浏览器或者其他APP的webview中拉起相应的APP,也可以在APP中使用相应的功能,从而来把用户引流到APP中。...举个例子,你的用户safari里面浏览一个你们公司的网页,而此时用户手机也同时安装有你们公司的App;而Universal Link能够使得用户在打开某个详情页时直接打开你的app并到达app中相应的内容页面...另外,URL scheme因为是自定义的协议,所以在没有安装 app 的情况下是无法直接打开的(在Safari中还会出现一个不可打开的弹窗),而Universal Link(通用链接)本身是一个HTTPS...或者将要测试的网址在Safari中打开,在出现的网页上方下滑,可以看到有在”xxx”应用中打开, 出现菜单: 当点击某个链接,直接可以进我们的app了,但是我们的目的是要能够获取到用户进来的链接,根据链接来展示给用户相应的内容

    2K11

    自动化-Appium-第一个Demo-Web(Java版)

    :5555的模拟器里,打开要操作的浏览器,本章示例为Android默认的浏览器,之后打开百度首页,此时在PC的Chrome浏览器中可以看到百度首页的访问链接,如图所示,模拟器里的默认浏览器版本号为44.0.2403.119...的真机里,打开要操作的Chrome浏览器,本章示例为已经在真机安装完成的Chrome浏览器,之后打开百度首页,此时在PC的Chrome浏览器中可以看到百度首页的访问链接,如图所示,真机里的Chrome浏览器版本号为...方式一:通过Mac上的Safari 首先将模拟器上的Safari打开,之后访问百度首页;之后打开Mac上的Safari,选择开发--->模拟器,可以看到此时模拟器打开的Webview页面,例如:百度首页...方式一:通过Mac上的Safari 首先将真机上的Safari打开,之后访问百度首页;之后打开Mac上的Safari,选择开发--->真机(真机名为test),可以看到此时真机打开的Webview页面,...例如:真机 此时检测到真机上打开的Webview页面,例如百度首页 选中后,鼠标右键点击转到…… 打开选中的页面,将Chrome的开发者工具打开,显示html源码信息,则可以获取相应的Webview

    2.2K10

    WKWebView详解

    ) BOOL canGoForward; 即在前进后退记录中,当前记录之后是否还有记录 iOS 9.0+是否允许按住链接就展示链接的预览 @property(nonatomic) BOOL allowsLinkPreview...; 在iOS上,这个属性只在支持3D Touch的设备上支持 在iOS 10及以后的系统版本默认值是YES,之前的默认值是NO 如果将该属性的值设置为YES,则iOS用户可以按下链接来预览链接,并可以检测到地址和电话号码等数据...该动作会将应用程序切换到Safari 如果您想在iOS中支持链接预览,但又想要在应用程序中保留用户,那么您可以将WKWebView类转换为SFSafariViewController类 如果您使用WebView...作为应用内浏览器,那么进行这种更改是最佳选择 SFSafariViewController自动支持链接预览 iOS 10.0+开始支持自定义链接预览,你也可以通过这种方式来实现用户预览网页并pop后仍然留在应用内而不用切换到...当选择是在单一块中时粒度可能是单个的字符,当选择不是局限于单一块,粒度可能是一个块 WKUserInterfaceDirectionPolicy 用于确定WebView中用户界面元素的方向性的策略。

    20.7K193

    自动化-Appium-元素定位工具

    打开设备应用程序里含有Webview的页面,接下来打开PC的Chrome浏览器,输入访问地址chrome://inspect/ 如图所示,可以检测到当前应用程序界面是Webview。...点击页面的inspect链接,弹出新窗口,显示当前页面的Webview元素信息(由于国内网络问题,第一次页面加载可能需要FANQIANG)。元素定位方法同Selenium WebDriver一致。...4、打开Mac上的Safari,选择开发--->设备(如图:设备名为test),可以看到此时真机设备打开的Webview页面,例如:帮帮应用的帮助中心页面。...2.2.2ios_webkit_debug_proxy 首先将真机设备上的应用程序打开,之后打开此应用显示的Webview页面; 之后在Mac上打开终端,输入启动代理命令 ios_webkit_debug_proxy...3、能够在ios-webkit-debug-proxy上进行二次开发,这是因为RemoteDebug iOS Webkit Adapter项目是基于ios-webkit-debug-proxy项目构建的

    4.5K10

    【IOS开发基础系列】UIWebView专题

    自己生成的html,有时无法避免要使用local css, js or image (当然你也可以使用url来链接到网上的css/js/image)。         ...方法在网页中为选中文字创建高亮标签,当页面高度超过屏幕高度时,如果页面顶部和初始加载时的位置不同(进行过滚动),则每次添加高亮,页面就重新跳到初始加载时的位置,而不是保持当前位置。         .../537.51.2 (KHTML, like Gecko)中华浏览器/1.2.2 3 使用技巧 3.1 高级开发技巧 3.1.1 在UIWebView上面添加一个头视图 让它能随webView滚动 在UIWebView...上面添加一个头视图 让它能随webView滚动 http://www.jianshu.com/p/59960ac2b3a1 iOS开发-UIWebView添加头部与尾部控件 && 仿iOS 今日头条新闻详情页结构实现...3.2.2 【谨记】在WebviewVC的init方法中执行视图操作导致ViewdidLoad方法提前调起         这应该是IOS的一个bug,千万不能再WebViewVC的init方法中做视图操作

    38730

    自动化-Appium-第一个Demo-混合(Java版)

    :5555的模拟器里,打开要操作的应用程序webview页面,本章示例为打开帮帮应用-帮助中心页面,此时在PC的Chrome浏览器中可以看到帮助中心页的访问链接,如图所示,模拟器里的WebView版本号为...的真机里,打开要操作的应用程序webview页面,本章示例为打开去哪儿应用-我的页面,此时在PC的Chrome浏览器中可以看到我的页面访问链接,如图所示,真机里的WebView版本号为55.0.2883.91...要想在IOS模拟器中运行应用,则必须在Xcode中编译时选择模拟器类型,编译生成的文件后缀为.app (2)如果是在真机上运行,需要装.ipa的应用程序文件。分为正式版和开发版。...方式一:通过Mac上的Safari 首先将模拟器上的应用程序打开,之后打开此应用显示的Webview页面;之后打开Mac上的Safari,选择开发--->模拟器,可以看到此时模拟器打开的Webview页面...方式一:通过Mac上的Safari 首先将真机设备上的应用程序打开,之后打开此应用显示的Webview页面;之后打开Mac上的Safari,选择开发--->真机设备(如图:设备名为test),可以看到此时真机设备打开的

    2.6K30

    iOS防止在WKWebView中打开Universal Link

    前言 在wap中唤起app应用最最广泛的方式并不是Universal Link,而是直接Schema跳转 location.href = 'schema://公众号:iOS逆向' 在 iOS9 之前...而Universal Links 可以链接到您应用中的内容并安全地共享数据。...Universal Links 是标准 HTTP 或 HTTPS 链接,因此既适用于网站,也适用于应用程序。 如果未安装您的应用程序,则系统会在 Safari 中打开URL,以使您的网站能够处理它。...当用户安装您的应用程序时,iOS 会检查存储在Web服务器上的文件,以验证您的网站是否允许您的应用程序代表其处理URL 公众号:iOS逆向 https://developer.apple.com/library.../download/u011018979/21361507 1.1 防止在WKWebView中打开Universal Link的原理: 防止在WKWebView中打开Universal Link的原理:

    3.1K30

    IOS开发系列——UIWebView专题【整理,部分原创】

    自己生成的html,有时无法避免要使用local css, js or image(当然你也可以使用url来链接到网上的css/js/image)。...其解决方法需要Javascript和navtive code一起来做,其基本原理可参考这片文章,其流程是在Javascript handler中每创建Ajax的请求时,需要将这段js存在ajax_handler.js...http://blog.csdn.net/fengbingyang/article/details/7484453 方案一: 最近在使用ios中的UIWebView显示本地网页时,遇到如下问题:...,当页面高度超过屏幕高度时,如果页面顶部和初始加载时的位置不同(进行过滚动),则每次添加高亮,页面就重新跳到初始加载时的位置,而不是保持当前位置。...方案二:在shouldStartLoadWithRequest方法中进行url相等判断,然后对于#号url进行延迟执行loadNavigationTitle的处理: - (BOOL)webView:(

    94240

    iOS学习巩固笔记-UIWebViewJavaScript

    1 UIWebView简介 UIWebView是iOS内置的浏览器控件 系统自带的Safari浏览器就是通过UIWebView实现的 UIWebView不但能加载远程的网页资源,还能加载绝大部分的常见文件...手机上面的safai其实就是用webView来实现的  现在的开发并不完全是原生的开发,而更加倾向于原生+Html5的方式  webView是OC代码和html代码之间进行交互的桥梁 3.1.1 代码...; 常用的属性设置 //设置网页自动适应 self.webView.scalesPageToFit = YES; //设置检测网页中的格式类型,all表示检测所有类型包括超链接、电话号码、地址等。...,只需要判断一下当前的协议头是不是这个就能判断你现在是否是JS调用。...(任意调用对象消息方法并可以传N多参数的一个类) 在iOS中可以直接调用某个对象的消息方式有两种: performSelector:withObject; NSInvocation。

    1.2K70

    【Web技术】 275- 理解 WebView

    这种灵活性打开了一个浏览器端的 Web 应用和希望展示在原生应用中的 Web 应用代码之间可重用的世界。...有许多应用通过依赖 WebView 作为应用内浏览器来以类似的方式打开链接。 广告 广告仍然是原生应用最流行的赚钱方式之一。这些广告大部分是如何投放的?...事实上,这些应用所做的唯一原生操作就是托管 WebView,而 WebView 又加载 Web 内容和用户交互的所有 UI。混合应用很受欢迎有几个原因。最大的一个是开发人员生产力。...这些基于 Web 的扩展程序(如维基百科)在 Word 等 Office 应用中的表现方式是通过——是的,WebView: ? WebView 中显示的实际内容来自此URL。...除此以外,你在 WebView 中看到的内容与你在浏览器中看到的内容相同,尤其是使用同一渲染引擎时: 在 iOS 上,Web 渲染引擎始终是 WebKit,与 Safari 和 Chrome 相同。

    87020

    H5如何与原生App通信?

    但需要注意的是,Safari浏览器使用的浏览器控件和UIwebView组件并不是同一个,两者在性能上有很大的差距。...RN容器 在react-native开发中,从rn 0.37版本开始官方引入了组件,在安卓中调用原生浏览器,在IOS中默认调用的是UIWebView容器。...m.douyu.com' }} /> WebView组件不要嵌套在或原生点击组件中,会造成H5内页面滚动失效 h5向ios客户端发送消息; 在ios中,并没有现成的api让js去调用native的方法,...params=' + encodeURIComponent(obj)然后带上你要传递给ios的参数;然后在客户端内拦截到指定协议头的请求之后就阻止该请求并解析url上的参数,执行相应逻辑 在H5中发起这种特定协议的请求方式分两种...在了解了js与客户端底层的通信原理后,我们可以将IOS、安卓统一封装成jsBridge提供给业务层开发调用。

    6.1K20

    WKWebView 那些坑

    在 WKWebView 中加载下面的测试链接可以稳定重现白屏现象: http://people.mozilla.org/~rnewman/fennec/mem.html 这个时候 WKWebView.URL...,我们在该函数里执行[webView reload](这个时候 webView.URL 取值尚不为 nil)解决白屏问题。...实践发现 WKWebView 实例其实也会将 Cookie 存储于 NSHTTPCookieStorage 中,但存储时机有延迟,在iOS 8上,当页面跳转的时候,当前页面的 Cookie 会写入 NSHTTPCookieStorage...id=138169 (复制链接到浏览器中打开) 因此,如果通过 registerSchemeForCustomProtocol 注册了 http(s) scheme, 那么由 WKWebView 发起的所有...API,依然没有找到合适的解决方案,同时发现 Safari 以及 Chrome 这两个全量切换到 WKWebView 的浏览器也存在同样的问题:对webGL 页面的截屏结果不是空白就是纯黑图片。

    4.7K130

    WWDC案例解读:大众点评相机直接扫描支付是怎么实现的

    简单灵活:URL对于H5和App是通用的,如果没有安装App,就会跳转到Safari打开对应H5。 私密性:在跳转之前并不需要知道用户是否安装目标App。...事情到此还没有完全结束,这种实现方式会带来另一个问题:这条物料二维码对应URL在WebView内打开的行为会发生改变。...按照Apple官方的解释:Universal-Link由用户“主动”触发,例如在邮件,记事本或是其它App中通过openURL唤起App打开这个URL;而如果用户处在Safari浏览器内直接输入或是点击链接打开这个...最终在非常困难的情况下,我们和业务同学达成共识:对于这批特殊的投放物料二维码,业务系统保证URL使用场景的唯一性,不会在除二维码之外的其它场景使用这批特征URL,绕过App内WebView打开异常的Case...这样我们完成了“对于既有投放二维码的iOS相机扫码唤起App”实现。 在这个特殊的场景中,整个流程的发起始自于App外,业务非常需要了解当前处于“相机扫码唤起App”的场景。

    82120

    自动化-Appium-​第一个Demo-Web(Python版)

    :5555的模拟器里,打开要操作的浏览器,本章示例为Android默认的浏览器,之后打开百度首页,此时在PC的Chrome浏览器中可以看到百度首页的访问链接,如图所示,模拟器里的默认浏览器版本号为44.0.2403.119...的真机里,打开要操作的Chrome浏览器,本章示例为已经在真机安装完成的Chrome浏览器,之后打开百度首页,此时在PC的Chrome浏览器中可以看到百度首页的访问链接,如图所示,真机里的Chrome浏览器版本号为...方式一:通过Mac上的Safari 首先将模拟器上的Safari打开,之后访问百度首页;之后打开Mac上的Safari,选择开发--->模拟器,可以看到此时模拟器打开的Webview页面,例如:百度首页...方式一:通过Mac上的Safari 首先将真机上的Safari打开,之后访问百度首页;之后打开Mac上的Safari,选择开发--->真机(真机名为test),可以看到此时真机打开的Webview页面,...例如:真机 此时检测到真机上打开的Webview页面,例如百度首页 选中后,鼠标右键点击转到…… 打开选中的页面,将Chrome的开发者工具打开,显示html源码信息,则可以获取相应的Webview

    2.5K10

    app中的webview通识篇(上)

    webview协议约定 为了更好的在app中调试开发我们的移动页面(h5),我们需要与app开发人员约定一些基本的原则,来保证我们的页面可以很好的进行调试,包括调试工具、灵活的模拟上线时的app环境、测试交互过程中的问题...h5与app不同场景的分享互通 比如:用户在不同app中:app分享到h5详情页,h5详情页也可以对应到app中打开 需要约定规则 app提供webview的外壳 可以通过app外壳扫码进入webview...场景,模拟交互,开发阶段暴露解决一些app中问题 以上的app解决方案集成在这个app外壳中 关于 app内webiew与h5通讯情况 作为常识我们知道,一般情况下webview的页面是包括两种情况的...而另一方面,webview也可看做一个普通的浏览器,可以载入任何的页面,所以我们非app的内嵌页的h5也可以在app内通过webview进行打开; 而app外的h5可以通过app自定义的协议码来唤起app...原理是iOS端在WebView加载完一个URL链接的时候,手动向H5页面绑定一个JSContext对象。利用这个JSContext对象,可以实现OC与JS间的双向交互。

    5.2K20

    WKWebView 那些坑

    作者:林泽水 导语 WKWebView是苹果在WWDC 2014上推出的新一代webView组件,用以替代UIKit中笨重难用、内存泄漏的UIWebView, 拥有60fps滚动刷新率、和safari...在WKWebView中加载下面的测试链接可以稳定重现白屏现象:http://people.mozilla.org/~rnewman/fennec/mem.html 这个时候webView.URL会变为nil...,我们在该函数里执行[webView reload] (这个时候webView.URL取值尚不为nil)解决白屏问题。...实践发现WKWebView实例其实也会将Cookie存储于NSHTTPCookieStorage中,但存储时机有延迟,在iOS8上,当页面跳转的时候,当前页面的Cookie会写入NSHTTPCookieStorage...API,依然没有找到合适的解决方案,同时发现Safari以及Chrome这两个全量切换到WKWebView的浏览器也存在同样的问题:对webGL页面的截屏结果不是空白就是纯黑图片。

    17.5K21
    领券