You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:30:41