2

I want to bring out the share sheet with the AirDrop as the only option in my application.

In iOS 7, I could simple add all share types to the excludedActivityTypes property of UIActivityViewController (UIActivityTypeMessage, UIActivityTypeMail, ...)

But now in iOS 8, with the app extensions, the users may have extra sharing providers that show up. Is there any way to show AirDrop only?

UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:@[[NSURL URLWithString:url]]
                                                                         applicationActivities:nil];

NSArray *excludedActivities = @[UIActivityTypePostToTwitter, UIActivityTypePostToFacebook,
                                UIActivityTypePostToWeibo,
                                UIActivityTypeMessage, UIActivityTypeMail,
                                UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
                                UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll,
                                UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr,
                                UIActivityTypePostToVimeo, UIActivityTypePostToTencentWeibo];
Tamás Sengel
  • 55,884
  • 29
  • 169
  • 223
Felix Dumit
  • 458
  • 3
  • 9

3 Answers3

5
class AirDropOnlyActivityItemSource : NSObject, UIActivityItemSource {

    /// The item you want to send via AirDrop.
    let item: AnyObject

    init(item: AnyObject) {
        self.item = item
    }

    func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
        /// Use an empty URL as placeholder to let iOS Share Sheet show the AirDrop only.
        return NSURL(string: "")!
    }

    func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
        return item
    }   
}
Jonny
  • 1,969
  • 18
  • 25
3

Swift 4.2 version of Jonny's answer:

class AirDropOnlyActivityItemSource: NSObject, UIActivityItemSource {
    ///The item you want to send via AirDrop.
    let item: Any

    init(item: Any) {
        self.item = item
    }

    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        //using NSURL here, since URL with an empty string would crash
        return NSURL(string: "")!
    }

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

Usage:

let itemSource = AirDropOnlyActivityItemSource(item: "test")

let activityVc = UIActivityViewController(activityItems: [itemSource], applicationActivities: nil)
Tamás Sengel
  • 55,884
  • 29
  • 169
  • 223
  • How to add another built-in iOS App? (eg: `Message`, `Photos`...) – usinuniverse Feb 26 '19 at 06:33
  • UIActivityViewController is a great convenience, but I would like to send the files programmatically rather than manually. I want myDeviceApp to scan for all devices that have AirDrop enabled, get UUID of each device and send concurrently or synchronously a picture or video to all devices. Is this possible? – bibscy Jul 13 '19 at 12:49
  • I'm currently getting the error "Method does not override any method from its superclass" on the two internal funcs. :( – Rob Sawyer Oct 26 '20 at 02:53
-1

That's currently not possible. You should file an enhancement request with apple explaining why this would be useful to the user/developer.

ccjensen
  • 4,578
  • 2
  • 23
  • 25