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

Swift中「复制到应用」按钮的名称及自有应用实现方法

嘿,刚好对iOS分享这块熟得很!你说的这类「Copy to Spark」「Copy to Viber」的「复制到应用」按钮,在Swift开发里,官方对应的实现是自定义UIActivity——它是系统分享面板(UIActivityViewController)的扩展组件,能和原生的「复制」「分享到邮件」等操作并列展示。

一、官方名称准确界定

这类自定义的应用跳转/内容传递按钮,属于自定义UIActivity(Custom UIActivity),是UIActivity类的子类,用来扩展系统分享面板的功能,让你可以添加符合自身需求的自定义操作。

二、在自有应用中实现的步骤

我给你拆解成具体可落地的步骤,附带代码示例:

1. 创建自定义UIActivity子类

首先要写一个继承自UIActivity的子类,重写关键方法来定义按钮的显示样式和执行逻辑:

class CopyToSparkActivity: UIActivity {
    // 存储要传递的内容
    private var targetContent: String?
    
    // 自定义活动的唯一标识符(建议用反向域名格式,避免冲突)
    override var activityType: UIActivity.ActivityType? {
        return UIActivity.ActivityType("com.yourapp.copyToSpark")
    }
    
    // 按钮上显示的文字
    override var activityTitle: String? {
        return "Copy to Spark"
    }
    
    // 按钮图标(这里用系统图标示例,你可以替换成自定义的适配图标)
    override var activityImage: UIImage? {
        return UIImage(systemName: "message.fill")?.withTintColor(.purple, renderingMode: .alwaysOriginal)
    }
    
    // 判断当前内容是否支持该活动(比如这里只支持文本内容)
    override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
        return activityItems.contains(where: { $0 is String })
    }
    
    // 准备要传递的内容
    override func prepare(withActivityItems activityItems: [Any]) {
        // 提取第一个文本内容作为要传递的内容
        targetContent = activityItems.compactMap { $0 as? String }.first
    }
    
    // 核心:执行「复制到Spark」的操作
    override func perform() {
        guard let content = targetContent,
              // 用Spark的URL Scheme唤起应用并传递文本(不同应用的Scheme格式需查官方文档)
              let encodedContent = content.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
              let sparkURL = URL(string: "spark://send?text=\(encodedContent)") else {
            // 执行失败,通知系统结束活动
            activityDidFinish(false)
            return
        }
        
        if UIApplication.shared.canOpenURL(sparkURL) {
            // 唤起Spark应用
            UIApplication.shared.open(sparkURL)
            activityDidFinish(true)
        } else {
            // 如果用户没安装Spark,弹出提示引导下载
            let alert = UIAlertController(title: "提示", message: "未安装Spark应用,请先下载", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "确定", style: .default))
            // 拿到当前顶层控制器展示弹窗
            if let topVC = UIApplication.shared.connectedScenes
                .filter({$0.activationState == .foregroundActive})
                .map({$0 as? UIWindowScene})
                .compactMap({$0})
                .first?.windows
                .filter({$0.isKeyWindow}).first?.rootViewController {
                topVC.present(alert, animated: true)
            }
            activityDidFinish(false)
        }
    }
}

2. 在分享面板中添加自定义活动

当你需要展示带自定义按钮的分享面板时,初始化UIActivityViewController并传入自定义的活动实例:

// 要分享的内容
let shareText = "这是我从自有应用分享的内容!"
let activityItems: [Any] = [shareText]

// 实例化自定义活动(如果需要多个,就加多个实例到数组里)
let customActivities = [CopyToSparkActivity()]

// 创建系统分享面板
let activityVC = UIActivityViewController(activityItems: activityItems, applicationActivities: customActivities)

// 适配iPad:需要设置popover的展示来源
if let popoverPresenter = activityVC.popoverPresentationController {
    popoverPresenter.sourceView = yourTriggerButton // 触发分享的按钮
    popoverPresenter.sourceRect = yourTriggerButton.bounds
}

// 弹出分享面板
present(activityVC, animated: true)

3. 关键配置:Info.plist添加URL Scheme白名单

iOS 10及以上,如果你要调用其他应用的URL Scheme,必须在Info.plist里添加LSApplicationQueriesSchemes数组,把目标应用的Scheme加进去(比如Spark的是spark),否则canOpenURL()会返回false:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>spark</string>
    <string>viber</string> <!-- 如果还要支持Viber,就加上这个 -->
</array>

额外说明

  • 不同应用的URL Scheme格式不一样,比如Viber的是viber://forward?text=xxx,你需要查目标应用的官方文档来确认正确的调用格式。
  • 如果目标应用不支持URL Scheme,那可以考虑用App Groups来共享数据,让目标应用监听共享容器里的数据变化,但这种方式需要目标应用配合实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:01:55