如何在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
相关产品推荐
相关产品推荐

