Search code examples
iosswiftxcodeswift3

How to Remove "Add to iCloud Drive" from UIActivity Controller?


I want to remove "iCloud drive" option from sharing UIActivity Controller,Here is a snap shot.

enter image description here

I tried this ,but it's not working in 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")]

Solution

  • May help depending on version:

    Apple keeps changing the bundle ID for this extension. You may need to exclude this too, but depends on iOS SDK version:

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

    Activity Item Providers for after user selection:

    You could also pass in UIActivityItemProvider objects instead of raw objects to your UIActivityViewController initializer. This unfortunately does not change what options are enabled in the UI, but will quit out if there's no item returned after user selection.

    Firstly, create a new class for your provider. You could use this to return different content based on different providers too! I.e. an image and text for mail, text only for 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
        }
    }
    

    Then you initialize your UIActivityItemProvider like so:

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

    Or, the hacky but legal way to do what you want:

    After above, you could add a placeholder empty UIImage, remove the additional options which are now available, and only return what you want from your provider:

    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
        }
    }