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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:24:01