如何从 UIActivity 控制器中删除“添加到 iCloud Drive”?

Posted

技术标签:

【中文标题】如何从 UIActivity 控制器中删除“添加到 iCloud Drive”?【英文标题】:How to Remove "Add to iCloud Drive" from UIActivity Controller? 【发布时间】:2017-07-04 06:31:54 【问题描述】:

我想从共享 UIActivity 控制器中删除“iCloud 驱动器”选项,这是一个快照。

我试过了,但它在 swift 3 中不起作用。

activityViewController.excludedActivityTypes = [.assignToContact,.copyToPasteboard,.print,.saveToCameraRoll,.addToReadingList,UIActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension"),UIActivityType(rawValue: "com.apple.mobilenotes.SharingExtension"),UIActivityType(rawValue: "com.apple.iCloudDrive.ShareExtension"),UIActivityType(rawValue: "com.apple.mobileslideshow.StreamShareService")]

【问题讨论】:

你是如何创建activityViewController 的? 让 activityViewController = UIActivityViewController(activityItems: [media as Any], applicationActivities: nil) activityViewController.popoverPresentationController!.sourceView = self media 对象包含什么? 媒体只能是图片或视频 【参考方案1】:

可能会有所帮助,具体取决于版本

Apple 不断更改此扩展的捆绑 ID。您可能也需要排除它,但取决于 ios SDK 版本:

UIActivityType(rawValue: "com.apple.CloudDocsUI.AddToiCloudDrive")

用户选择后的活动项目提供者:

您还可以将 UIActivityItemProvider 对象而不是原始对象传递给您的 UIActivityViewController 初始化程序。不幸的是,这不会改变 UI 中启用的选项,但如果用户选择后没有返回任何项目,则会退出。

首先,为您的提供者创建一个新类。您也可以使用它来根据不同的提供者返回不同的内容! IE。用于邮件的图像和文本,仅用于 iMessage 的文本。

class ShareActivityItemProvider: UIActivityItemProvider 
    override func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? 
        print("activity type selected: \(activityType.rawValue)")
        // These are your accepted activity types
        if activityType == .postToFacebook || activityType == .postToTwitter || activityType == .postToWeibo || activityType == .mail || activityType == .message 
            return placeholderItem
        
        return nil
    

然后你像这样初始化你的 UIActivityItemProvider:

let avc = UIActivityViewController(activityItems: [ShareActivityItemProvider(placeholderItem: "Test message or any object")], applicationActivities: nil)

或者,做你想做的事的老套但合法的方式:

在上面之后,您可以添加一个占位符为空的 UIImage,删除现在可用的其他选项,并且只从您的提供者返回您想要的:

let avc = UIActivityViewController(activityItems: [ShareActivityItemProvider(placeholderItem: "Test message or any object"), ShareActivityItemProvider(placeholderItem: UIImage())], applicationActivities: nil)
avc.excludedActivityTypes = [.assignToContact, .saveToCameraRoll, ... others ...]

class ShareActivityItemProvider: UIActivityItemProvider 
    override func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? 
        print("activity type \(activityType.rawValue) \(activityType)")
        if placeholderItem is String, activityType == .postToFacebook || activityType == .postToTwitter || activityType == .postToWeibo || activityType == .mail || activityType == .message 
            return placeholderItem
        
        return nil
    

【讨论】:

您能否为此提供客观的 c 代码? @mm282

以上是关于如何从 UIActivity 控制器中删除“添加到 iCloud Drive”?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 UIActivityViewController 中的原始 WhatsApp UIActivity?

如何在 ios 的 UIactivity 视图控制器中仅显示 facebook、twitter 和电子邮件(目标 c)?

为标准应用添加自定义 UIActivity

如何向 SFSafariViewController 添加自定义活动?

UIActivity activityViewController 在 iPad 上以模态方式呈现,而不是在弹出窗口中

如何在集合视图的底部/页脚中添加 uiactivity 指示器?