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

iOS 11开发:如何禁用UIActivityViewController中的Save To Files功能?

解决UIActivityViewController屏蔽Save To Files及指定分享渠道的问题

我之前也碰到过类似的坑,直接用com.apple.CloudDocsUI.AddToiCloudDrive确实偶尔会失效,尤其是跨iOS版本的时候。下面给你一套经过验证的可靠解决方案:

一、核心问题:为什么直接写字符串标识符不行?

iOS 11之后苹果为「Save To Files」提供了官方的UIActivityType常量,用系统常量比手动写硬编码字符串更稳定,能避免系统版本更新导致标识符变更的问题。

二、完整实现步骤

1. 生成临时PDF文件(满足「不存储在设备上」的要求)

UIActivityViewController分享文件需要传入URL,我们可以把生成的PDF写入临时目录,分享完成后立即删除,不会留下持久化文件:

// 假设你已经有生成好的PDF数据
let pdfData: Data = ... 

// 创建带UUID的临时文件URL,避免重名冲突
let tempDirectory = NSTemporaryDirectory()
let tempFileURL = URL(fileURLWithPath: tempDirectory)
    .appendingPathComponent("temp_\(UUID().uuidString).pdf")

do {
    try pdfData.write(to: tempFileURL)
    // 后续创建分享控制器...
} catch {
    print("写入临时PDF失败:\(error.localizedDescription)")
    return
}

2. 配置UIActivityViewController并屏蔽指定渠道

用系统常量屏蔽官方渠道,第三方渠道则需要找到对应的activity type字符串(可以通过打印availableActivities查看具体值):

let activityVC = UIActivityViewController(
    activityItems: [tempFileURL],
    applicationActivities: nil
)

// 初始化要屏蔽的活动类型数组
var excludedActivities: [UIActivity.ActivityType] = [
    // 屏蔽Save To Files(官方常量,iOS11+可用)
    .saveToFiles,
    // 屏蔽系统自带的Facebook分享
    .postToFacebook,
    // 屏蔽系统自带的Vimeo分享
    .postToVimeo
]

// 屏蔽Twillio(替换成Twillio实际的activity type字符串,可通过打印availableActivities获取)
if let twillioActivityType = UIActivity.ActivityType("com.twillio.share") {
    excludedActivities.append(twillioActivityType)
}

activityVC.excludedActivityTypes = excludedActivities

3. 分享完成后删除临时文件

确保临时文件不会留在设备上:

activityVC.completionWithItemsHandler = { [weak self] _, _, _, _ in
    guard let self = self else { return }
    try? FileManager.default.removeItem(at: tempFileURL)
}

// 弹出分享控制器
present(activityVC, animated: true)

三、兜底方案:如果还是无法屏蔽Save To Files

如果用UIActivityType.saveToFiles依旧不生效,可以尝试遍历可用活动,通过标题匹配后屏蔽(注意:标题会随系统语言变化,仅作为兜底方案):

// 在present分享控制器前,异步获取可用活动列表
DispatchQueue.main.async {
    if let availableActivities = activityVC.availableActivities {
        for activity in availableActivities {
            // 匹配英文标题,其他语言需要对应调整为本地化后的标题
            if activity.title == "Save to Files" {
                excludedActivities.append(activity.activityType)
                activityVC.excludedActivityTypes = excludedActivities
                break
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:28:44