iOS 多文件共享方案咨询:如何让第三方应用共享多份文件到宿主应用
iOS多文件共享到宿主App实现方案
核心适配逻辑
你当前使用的application(_:open:options:代理仅支持单文件回调,多文件共享场景需通过以下两种方案实现:
方案1:集成Share Extension(兼容性最优,全系统版本支持)
该方案是Twitter等主流应用处理多文件共享的通用实现,可完全覆盖Photos、Files等所有第三方应用的多文件分享场景:
- 第一步:给项目新增Share Extension target,在Extension的info.plist中配置
NSExtensionActivationRule,声明支持的文件类型,最大数量填0表示不限制共享数量,示例配置如下:
<key>NSExtension</key> <dict> <key>NSExtensionAttributes</key> <dict> <key>NSExtensionActivationRule</key> <dict> <key>NSExtensionActivationSupportsFileWithMaxCount</key> <integer>0</integer> <key>NSExtensionActivationSupportsImageWithMaxCount</key> <integer>0</integer> <key>NSExtensionActivationSupportsMovieWithMaxCount</key> <integer>0</integer> <!-- 按需新增你声明支持的其他UTI类型规则 --> </dict> </dict> <key>NSExtensionPointIdentifier</key> <string>com.apple.share-services</string> <!-- 其他Extension基础配置保持默认即可 --> </dict>
- 第二步:给主App和Share Extension同时开启App Group能力,用于两个组件间的文件共享
- 第三步:在Share Extension的主控制器中遍历
extensionContext?.inputItems拿到所有共享项,通过NSItemProvider读取每个文件的URL,将文件转存到App Group的共享目录 - 第四步:所有文件转存完成后,通过自定义URL Scheme唤醒主App,将共享目录下的所有文件路径拼接为URL参数传递给主App
- 第五步:主App在
application(_:open:options:回调中解析参数,从共享目录读取所有文件做业务处理,处理完成后清理临时共享文件即可
方案2:纯主App适配(仅支持iOS13+,无需扩展)
如果不需要兼容iOS13以下系统,且仅需支持Files等应用的直接多文件打开场景,可以直接适配UIScene生命周期的回调:
- 确认你的App已开启UIScene生命周期,在SceneDelegate中实现
scene(_:openURLContexts:方法,该方法的URLContexts参数会包含所有共享文件的URL:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { // 遍历所有上下文即可拿到全部共享文件的URL let allFileURLs = URLContexts.map { $0.url } // 后续处理逻辑和单文件场景一致 }
- 注意:该方案兼容性有限,部分应用的分享面板不会触发该回调,仅推荐作为辅助适配方案
注意事项
- 所有从外部获取的文件URL都需要先调用
startAccessingSecurityScopedResource()获取访问权限,处理完成后调用stopAccessingSecurityScopedResource()释放权限 - 大文件共享优先使用硬链接或者直接访问安全域URL,不要全量拷贝到主App沙盒,避免占用过多存储空间
- 若需要读取Photos共享文件的原始元数据,可以通过
NSItemProvider直接获取PHAsset对象,无需读取文件本身
内容的提问来源于stack exchange,提问作者cnbecom
相关产品推荐
相关产品推荐

