苹果免签封装是一种开发技巧,用来对 ios 设备进行网页封装,让网页应用拥有类似于原生应用的体验。在免签封装过程中,防止跳转浏览器是一个关键点,可以增强用户在应用中的封闭性和沉浸感。为了实现这个目的,我们可以采用以下方法来防止跳转浏览器:
一、使用 uiwebview 或者 wkwebview 进行封装
制作苹果免签封装时,一般会使用 uiwebview 或者 wkwebview 控件对 h5 网页进行封装。uiwebview 和 wkwebview 是 ios 工具包中的 webview 控件,可以与 h5 网页进行交互,并在应用内展示网页内容。这样一来,用户就不会被转移到其他浏览器。
注意:苹果公司已经开始逐渐废弃 uiwebview 组件,推荐使用 wkwebview。wkwebview 相比 uiwebview,功能更丰富、性能更好,更适合新的项目开发。
二、处理链接点击事件
防止用户点击链接时跳转到其他浏览器,我们需要在封装网页的时候劫持 webview 中的链接点击事件,使其在当前 webview 中打开。具体可以按以下步骤操作:
1. 实现 wkwebview 的代理方法 `webview(_:decidepolicyfor:decisionhandler:)`,用于处理用户的导航请求。
2. 在这个代理方法中,判断导航请求的类型。如果请求类型为 `linkactivated`,表明这是用户点击链接导致的请求,则让 `wkwebview` 加载这个请求,同时阻止原有请求的跳转:
“`swift
func webview(_ webview: wkwebview, decidepolicyfor navigationaction: wknavigationaction, decisionhandler: @escaping (wknavigationactionpolicy) -> void) {
// 判断导航请求类型
if navigationaction.navigationtype == .linkactivated {
// 使用 webview 加载请求
webview.load(navigationaction.request)
// 阻止原有请求的跳转
decisionhandler(.cancel)
} else {
// 允许其他导航请求
decisionhandler(.allow)
}
}
“`
这样设置后,应用中的链接点击都会在当前 webview 中打开。
三、处理 javascript 的 `window.open` 跳转
有些网页可能使用 javascript 中的 `window.open` 函数进行跳转,这种情况下我们还需要注意处理。具体操作方法如下:
1. 实现 wkwebview 的代理方法 `webview(_:createwebviewwith:for:windowfeatures:)`,用于处理 `window.open` 请求。
2. 在这个代理方法中,让原有的 `wkwebview` 加载新的请求,同时返回 `nil` 阻止创建新的 `wkwebview`,这样就可以避免跳转到其他浏览器:
“`swift
func webview(_ webview: wkwebview, createwebviewwith configuration: wkwebviewconfigu

ration, for navigationaction: wknavigationaction, windowfeatures: wkwindowfeatures) -> wkwebview? {
// 使用 webview 加载请求
webview.load(navigationaction.request)
// 阻止创建新的 webview
return nil
}
“`
通过以上方法,在苹果免签封装应用中就可以防止跳转其他浏览器,为用户提供更好的封闭式体验。



