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

