如何在UIActivityViewController中隐藏本应用的Share Extension
这个问题我做项目时也碰到过,其实iOS已经给我们提供了几种简单的方案来解决,不用绕远路~
方案一:直接排除指定扩展类型
最省心的方式就是在初始化UIActivityViewController时,把自己的Share Extension对应的活动类型加入到排除列表里。
步骤很简单:
- 先找到你Share Extension的Bundle ID(在Xcode的Target设置→General选项卡下的Bundle Identifier,比如
com.yourcompany.yourapp.ShareExtension)。 - 在创建
UIActivityViewController时,把这个Bundle ID转成UIActivityType,添加到excludedActivityTypes数组中:
// 假设你要分享的内容是items数组 let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil) // 替换成你自己的Share Extension Bundle ID if let selfExtensionType = UIActivityType(rawValue: "com.yourcompany.yourapp.ShareExtension") { activityVC.excludedActivityTypes = [selfExtensionType] } present(activityVC, animated: true, completion: nil)
这样你的应用唤起分享面板时,就不会显示自己的Share Extension了。
方案二:通过自定义ItemSource控制显示
如果你的分享内容需要做更多自定义处理,也可以通过实现UIActivityItemSource协议来精准控制哪些活动可以显示:
class CustomShareItemSource: NSObject, UIActivityItemSource { // 返回占位内容,实际分享内容在下面的方法里返回 func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any { return "" } // 返回真实的分享内容 func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType?) -> Any? { return "你的分享内容" } // 控制是否显示某个活动类型 func activityViewController(_ activityViewController: UIActivityViewController, canPerformActivityType activityType: UIActivityType?) -> Bool { // 排除自己的Share Extension if activityType?.rawValue == "com.yourcompany.yourapp.ShareExtension" { return false } // 其他活动默认允许显示 return true } } // 使用自定义ItemSource创建分享面板 let itemSource = CustomShareItemSource() let activityVC = UIActivityViewController(activityItems: [itemSource], applicationActivities: nil) present(activityVC, animated: true)
几个注意点
- 一定要确保用的是Share Extension的Bundle ID,不是主应用的!
- 这个设置只对你自己的应用唤起的分享面板生效,其他第三方应用唤起分享时,依然会显示你的扩展——这是正常的,毕竟其他应用没有理由隐藏它。
- 如果你的扩展支持多种活动类型,可能需要排查所有对应的
UIActivityType值,但一般Share Extension默认只有一个对应的类型。
内容的提问来源于stack exchange,提问作者Ilesh Panchal
相关产品推荐
相关产品推荐

