Swift 4环境下,如何用按钮和文本框在App内打开其他页面的链接?
在Swift 4应用内打开链接(无需跳转Safari)
当然可以啦!在Swift 4开发中,完全能实现点击按钮、读取文本框里的链接后,在应用内部打开网页,不用跳转到Safari。下面给你详细的实现方案,都是项目里常用的做法:
1. 用WKWebView实现应用内网页展示
首先推荐使用WKWebView,它是苹果推荐的新一代网页控件,相比老旧的UIWebView性能更好、内存占用更低,而且iOS 8之后就支持了,完全适配Swift 4。
步骤1:创建WebView页面
先新建一个专门用来展示网页的WebViewController,代码如下:
import WebKit class WebViewController: UIViewController, WKNavigationDelegate { var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() // 初始化WKWebView配置 let webConfig = WKWebViewConfiguration() webView = WKWebView(frame: view.bounds, configuration: webConfig) webView.navigationDelegate = self view.addSubview(webView) // 设置自动布局,让WebView铺满整个屏幕 webView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ webView.topAnchor.constraint(equalTo: view.topAnchor), webView.leadingAnchor.constraint(equalTo: view.leadingAnchor), webView.trailingAnchor.constraint(equalTo: view.trailingAnchor), webView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) } // 可选:监听网页加载状态,显示/隐藏网络活动指示器 func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { UIApplication.shared.isNetworkActivityIndicatorVisible = true } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { UIApplication.shared.isNetworkActivityIndicatorVisible = false } }
2. 处理按钮点击,加载文本框中的链接
假设你有一个主页面(比如MainViewController),里面有文本框(urlTextField)和触发按钮(openLinkButton)。点击按钮时,我们读取文本框的链接,处理格式后传递给WebViewController加载。
代码示例:
import UIKit class MainViewController: UIViewController { @IBOutlet weak var urlTextField: UITextField! @IBAction func openLinkTapped(_ sender: UIButton) { // 先检查文本框是否为空 guard let inputUrlString = urlTextField.text, !inputUrlString.trimmingCharacters(in: .whitespaces).isEmpty else { let alert = UIAlertController(title: "提示", message: "请输入有效的链接地址", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) return } // 处理链接格式:如果没有http/https前缀,自动补全https var formattedUrlString = inputUrlString if !formattedUrlString.hasPrefix("http://") && !formattedUrlString.hasPrefix("https://") { formattedUrlString = "https://" + formattedUrlString } // 验证URL是否有效 guard let targetUrl = URL(string: formattedUrlString) else { let alert = UIAlertController(title: "错误", message: "输入的链接地址无效", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) return } // 跳转到WebView页面并加载链接 let webVC = WebViewController() webVC.webView.load(URLRequest(url: targetUrl)) navigationController?.pushViewController(webVC, animated: true) } }
3. 关键注意事项
- HTTP链接权限:如果需要加载HTTP协议的链接,默认iOS会拦截,你需要在
Info.plist中添加App Transport Security设置。推荐只允许特定域名的HTTP链接(更安全),如果要全局允许,可以添加如下配置:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> - 传递列表中的链接:如果你的链接是来自应用内其他页面的列表,只需要把上面“读取文本框内容”的逻辑换成接收列表传递的URL即可,比如通过
WebViewController的属性传值,逻辑完全一致。 - 避免使用UIWebView:
UIWebView在iOS 12之后已经被苹果废弃,存在性能和安全问题,务必使用WKWebView。
内容的提问来源于stack exchange,提问作者hackDa dev
相关产品推荐
相关产品推荐

