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

如何在UIActivityViewController中添加“在Safari中打开”功能?

解决UIActivityViewController添加“在Safari中打开”功能的方法

嘿,我来帮你搞定这个问题!要给你的UIActivityViewController添上“在Safari中打开”的自定义选项,只需要创建一个UIActivity的子类,再把它加入到ActivityVC的自定义活动列表里就行。下面是具体的实现步骤和代码:

第一步:创建自定义的SafariActivity类

这个类会定义我们的“在Safari中打开”选项的外观和核心行为:

import UIKit

class SafariActivity: UIActivity {
    // 存储要打开的目标URL
    private var targetURL: URL?
    
    // 定义活动的唯一标识(可选,用于区分自定义活动)
    override class var activityType: UIActivity.ActivityType? {
        return UIActivity.ActivityType("com.yourapp.openinsafari")
    }
    
    // 活动显示的标题
    override var activityTitle: String? {
        return "在Safari中打开"
    }
    
    // 活动显示的图标(这里用系统Safari图标,也可以换成自定义图片)
    override var activityImage: UIImage? {
        return UIImage(systemName: "safari")?.withTintColor(.blue, renderingMode: .alwaysOriginal)
    }
    
    // 判断当前活动是否能处理传入的内容(只针对URL类型)
    override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
        for item in activityItems {
            if let url = item as? URL {
                targetURL = url
                return true
            }
        }
        return false
    }
    
    // 执行活动:调用Safari打开目标URL
    override func perform() {
        if let url = targetURL {
            UIApplication.shared.open(url, options: [:]) { [weak self] success in
                // 活动完成后标记结束
                self?.activityDidFinish(success)
            }
        } else {
            activityDidFinish(false)
        }
    }
}

第二步:修改你的分享按钮代码

在初始化UIActivityViewController时,把自定义的SafariActivity实例传入applicationActivities参数:

@IBAction func shareButtonPressed(_ sender: UIButton) {
    guard let url = URL(string: urlStr) else {
        // 处理URL无效的情况,避免崩溃
        return
    }
    // 创建自定义活动实例
    let safariActivity = SafariActivity()
    // 初始化ActivityVC并传入自定义活动
    let activityVC = UIActivityViewController(activityItems: [url], applicationActivities: [safariActivity])
    activityVC.popoverPresentationController?.sourceView = self.view
    self.present(activityVC, animated: true, completion: nil)
}

补充小提示

  • 我给代码加了URL有效性判断,替换了原有的强制解包,能避免URL格式错误导致的崩溃,这是个实用的小优化。
  • 图标部分用了系统SF Symbols的safari图标,如果你有自定义图标,直接替换activityImage的返回值就行。
  • 这个自定义活动只会在传入内容是URL时才会显示,完美匹配你的需求。

这样修改后,你的分享面板里就会出现“在Safari中打开”的选项,点击它就能直接用Safari打开目标URL啦。

内容的提问来源于stack exchange,提问作者Eric Hua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:05:11