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

iOS Action Extension如何实现Share Extension的数据共享功能?

关于Action Extension替代Share Extension实现数据共享的问题

核心结论

  • 不需要删除已有的Share Extension文件,可同时保留两者,后续可根据需求停用或删除Share Extension
  • 完全可以让Action Extension具备Share Extension的核心数据共享功能,两者本质都是App Extension,仅入口和默认配置存在差异

具体操作步骤

1. 配置Action Extension的Info.plist

要让Action Extension接收共享数据,需修改Info.plist中的NSExtension配置,重点定义可接收的数据类型:

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsText</key>
            <true/>
            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsImageWithMaxCount</key>
            <integer>5</integer>
        </dict>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.ui-services</string>
</dict>

NSExtensionActivationRule的配置逻辑和Share Extension一致,可根据需求调整支持的数据类型与数量。

2. 处理共享数据逻辑

在Action Extension的ViewController中,通过extensionContext获取共享数据,处理方式和Share Extension几乎相同:

override func viewDidLoad() {
    super.viewDidLoad()
    
    guard let items = extensionContext?.inputItems as? [NSExtensionItem] else { return }
    for item in items {
        guard let attachments = item.attachments else { continue }
        for attachment in attachments {
            // 处理文本类型
            if attachment.hasItemConformingToTypeIdentifier(kUTTypeText as String) {
                attachment.loadItem(forTypeIdentifier: kUTTypeText as String, options: nil) { (text, error) in
                    if let text = text as? String {
                        // 处理共享文本,可在主队列更新UI
                        DispatchQueue.main.async {
                            // 执行后续操作
                        }
                    }
                }
            }
            // 处理URL类型
            else if attachment.hasItemConformingToTypeIdentifier(kUTTypeURL as String) {
                attachment.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil) { (url, error) in
                    if let url = url as? URL {
                        // 处理共享URL
                    }
                }
            }
            // 可新增其他数据类型的处理逻辑
        }
    }
}

3. 调整入口显示(可选)

若希望Action Extension出现在系统分享菜单中(和Share Extension位置类似),可在NSExtensionAttributes中添加:

<key>NSExtensionActivationSupportsShareWithFriends</key>
<true/>

这样它会被归类到系统分享选项列表里。

额外注意事项

  • 两者可共存:测试阶段可同时保留两个扩展,确认Action Extension正常工作后,再删除Share Extension的目标文件即可
  • 权限配置:若需访问相册、网络等权限,需在Action Extension的Info.plist中添加对应权限描述,逻辑与主App、Share Extension一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:43:16