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

