如何在UIActivityViewController中仅保留Email+作为唯一分享选项?
如何移除UIActivityViewController默认分享选项,仅保留Email+
当然能搞定!要让UIActivityViewController只显示你需要的Email+分享选项,核心就是先把所有默认的分享入口都藏起来,再精准指定只留你要的那个。下面给你两种实用的实现思路,分情况选就行:
方法一:直接指定允许的活动类型(适合系统自带Email或已知ActivityType的场景)
这种方法最简单,先把所有系统默认的分享活动全部排除,再只允许你需要的Email+对应的活动类型:
- 第一步:创建
UIActivityViewController并准备好分享内容 - 第二步:通过
excludedActivityTypes把所有系统默认活动都列进去,隐藏它们 - 第三步:用
allowedActivityTypes指定只保留Email+对应的类型
Swift代码示例:
// 准备你要分享的内容(文本、图片等都可以) let shareContent = "这是我要通过Email+分享的内容" let activityVC = UIActivityViewController(activityItems: [shareContent], applicationActivities: nil) // 排除所有系统默认的分享选项(覆盖iOS各版本常见的类型) activityVC.excludedActivityTypes = [ .postToFacebook, .postToTwitter, .postToWeibo, .message, .mail, .print, .copyToPasteboard, .assignToContact, .saveToCameraRoll, .addToReadingList, .postToFlickr, .postToVimeo, .postToTencentWeibo, .airDrop, .openInIBooks, .markupAsPDF, .sharePlay ] // 只允许Email+对应的活动类型(如果是系统自带邮件,用.mail;如果是第三方Email+,替换成它的ActivityType) activityVC.allowedActivityTypes = [.mail] // 弹出分享控制器 present(activityVC, animated: true)
方法二:筛选匹配第三方Email+应用(如果是第三方邮件APP)
如果Email+是第三方应用,没有对应的系统UIActivityType,那就需要先遍历所有可用的分享活动,找到匹配该应用的项,再指定只保留它:
- 先加载活动控制器,获取所有可用的分享活动
- 根据应用的显示名称(比如"Email+")筛选出目标活动
- 把该活动的类型设置为唯一允许的类型
Swift代码示例:
let shareContent = "这是我要通过Email+分享的内容" let activityVC = UIActivityViewController(activityItems: [shareContent], applicationActivities: nil) // 目标应用的显示名称(就是分享列表里显示的APP名字) let targetAppName = "Email+" // 加载视图并获取可用活动 activityVC.loadViewIfNeeded() if let availableActivities = activityVC.availableActivities { // 找到匹配目标名称的活动 let targetActivity = availableActivities.first { $0.title == targetAppName } if let targetActivityType = targetActivity?.activityType { // 只允许这个活动类型 activityVC.allowedActivityTypes = [targetActivityType] } } // 设置弹出源(iPad需要,iPhone可省略) activityVC.popoverPresentationController?.sourceView = self.view // 弹出控制器 present(activityVC, animated: true)
注意事项
- 确保目标Email+应用已经安装在设备上,否则分享列表里不会出现它
- iOS不同版本的系统
UIActivityType可能有新增,所以excludedActivityTypes可以根据自己的iOS版本需求补充 - 如果用
allowedActivityTypes,系统会自动隐藏所有不在列表里的活动,所以也可以不用excludedActivityTypes,直接指定允许的类型即可(不过有些系统活动可能需要额外排除,视情况调整)
内容的提问来源于stack exchange,提问作者Sumit Kapadia
相关产品推荐
相关产品推荐

