You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS扩展中UIActivityViewController无法分享视频至Twitter的问题

iOS扩展中Twitter无法分享私有目录视频的解决方案

我来帮你解决这个iOS应用扩展里Twitter无法分享视频的问题——这个权限坑我之前也踩过!

问题根源

你遇到的核心问题是路径权限

  • 你的扩展Bundle内的文件(podhunt.app/PlugIns/podhunt-shareExtension.appex/下的视频)属于应用包的公开资源,第三方扩展(比如Twitter的分享组件)有权限读取;
  • /var/mobile/Containers/Data/PluginKitPlugin/.../Documents/是你的分享扩展的私有沙盒目录,这个路径受系统沙盒隔离保护,Twitter的扩展没有权限访问这里的文件,所以分享会静默失败。

解决方法:用App Group共享容器

要让Twitter能访问到你下载的视频,必须把文件放到App Group共享容器里,具体步骤如下:

1. 配置App Group权限

  • 先去Apple开发者后台,给你的主应用和分享扩展创建并启用同一个App Group(比如group.com.yourcompany.podhunt);
  • 在Xcode中,分别打开主应用和分享扩展的Signing & Capabilities面板,添加App Groups能力,勾选你刚才创建的分组。

2. 修改文件存储路径

把视频从临时下载位置移动到共享容器,而不是扩展自己的Documents目录。获取共享容器路径的代码:

// 替换成你自己的App Group ID
guard let sharedContainerUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.yourcompany.podhunt") else {
    print("无法获取共享容器路径")
    return
}
// 生成目标文件路径,建议用唯一标识符命名避免冲突
let videoFileName = "10c41d4a-c161-4c78-bc61-ca789804a982.mp4"
let destinationUrl = sharedContainerUrl.appendingPathComponent(videoFileName)

3. 更新分享代码

用共享容器里的URL来创建UIActivityViewController,完整代码如下:

URLSession.shared.downloadTask(with: audioUrl) { location, response, error in
    guard let location = location, error == nil else {
        print("下载失败:\(error?.localizedDescription ?? "未知错误")")
        return
    }
    
    do {
        // 获取共享容器路径
        guard let sharedContainerUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.yourcompany.podhunt") else {
            print("App Group配置错误")
            return
        }
        
        let videoFileName = "10c41d4a-c161-4c78-bc61-ca789804a982.mp4"
        let destinationUrl = sharedContainerUrl.appendingPathComponent(videoFileName)
        
        // 如果目标文件已存在,先删除避免移动失败
        if FileManager.default.fileExists(atPath: destinationUrl.path) {
            try FileManager.default.removeItem(at: destinationUrl)
        }
        
        // 移动文件到共享容器
        try FileManager.default.moveItem(at: location, to: destinationUrl)
        
        DispatchQueue.main.async {
            let activityVC = UIActivityViewController(activityItems: [destinationUrl], applicationActivities: nil)
            self.present(activityVC, animated: true, completion: nil)
        }
    } catch {
        print("文件处理出错:\(error.localizedDescription)")
    }
}.resume()

额外注意事项

  • 确保App Group ID在主应用和扩展中完全一致,否则无法访问共享容器;
  • 建议用UUID或唯一标识符命名视频文件,避免不同下载任务的文件互相覆盖;
  • 记得定期清理共享容器里的旧文件,避免占用用户设备空间。

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

火山引擎 最新活动