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

