如何防止动作扩展出现在我自己的 iOS 应用程序中?

How to prevent an action extension from appearing in my own iOS app?

我有一个 iOS 应用程序,它有一个动作扩展,用于在其他应用程序中显示图像时对它们执行操作 UIActivityViewController。一切都按预期工作 - 如果我在另一个应用程序中显示 activity sheet,我的操作扩展名会出现在列表中,旁边是系统操作(例如 保存到文件 创建表盘 等)。

但是,当我在我自己的应用程序中显示 UIActivityViewController 图片时,动作扩展也会出现在我自己的应用程序中,这是我不希望发生的。有什么方法可以防止我自己的操作扩展出现在我自己的应用程序中的 UIActivityViewController 中吗?

我试过在显示 UIActivityViewController 时向 excludedActivityTypes 添加一个条目,如下所示,但这没有用:

let activity = UIActivityViewController(activityItems: [media], applicationActivities: nil)
activity.excludedActivityTypes = [UIActivity.ActivityType("com.example.ActionExtensionIdentifier")]
// other setup code
present(activity, animated: true)

这是我最终使用的解决方案,以防其他人需要它。 (代码取自此博客 post:https://pspdfkit.com/blog/2016/hiding-action-share-extensions-in-your-own-apps/ 因此,也请查看该博客以了解更多详细信息,但我在此处提供的解决方案包含完成这项工作所需的一切。)

1.首先,创建这个 class

class ActionExtensionBlockerItem: NSObject, UIActivityItemSource {
    func activityViewController(_ activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: UIActivity.ActivityType?) -> String {
        return String()
    }

    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        return NSObject()
    }

    func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
        return String()
    }

    func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivity.ActivityType?, suggestedSize size: CGSize) -> UIImage? {
        return nil
    }

    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return String()
    }
}

2。应用 class

的实例

当您呈现 UIActivityViewController 时,创建 ActionExtensionBlockerItem 的实例并将其包含在 activityItems 数组中,如下所示:

func share(_ image: UIImage) {
    let activity = UIActivityViewController(activityItems: [image, ActionExtensionBlockerItem()], applicationActivities: nil)
    activity.popoverPresentationController?.sourceView = view // change to something appropriate for your app
    activity.popoverPresentationController?.sourceRect = view.bounds // change to something appropriate for your app
    present(activity, animated: true)
}