How to set mail subject with UIActivityItemProvider

I am using UIActivityViewController for sharing information through email. We are able to send email with body, attachments with no problem. But how do we set the subject title for the email.

I notice this question: How to set a mail Subject in UIActivityViewController?
The accepted solution is using UIActivityItemSource with this following API activityViewController:subjectForActivityType:. However, our code doesn’t conform to UIActivityItemSource because we are using UIActivityItemProvider.

  • Figuring out which icon was clicked on in UIActivityViewController
  • iOS: How to share text and image on social networks?
  • Share App application shortcut
  • How can I create a custom UIActivity in iOS?
  • Objective c - UIActivityViewController orientation mode
  • UIActivityViewController issue iOS 7 and iOS 8?
  • UIActivityItemSource

    You can use this protocol in situations where you want to provide the data from one of your app’s existing objects instead of creating a separate UIActivityItemProvider object.

    So the complete question is:

    How do I set the email subject if I am using UIActivityItemProvider instead of UIActivityItemSource?

    3 Solutions Collect From Internet About “How to set mail subject with UIActivityItemProvider”

    Define your custom item provider:

    @interface CustomProvider : UIActivityItemProvider
    @end
    

    Add to your implementation:

    @implementation CustomProvider
    
    // Some other code ... -(id)item and etc. 
    
    - (NSString *) activityViewController:(UIActivityViewController *)activityViewController
                   subjectForActivityType:(NSString *)activityType
    {
          return @"A dummy Title";
    }
    
    @end
    

    Notice that UIActivityItemProvider will automatically conform to UIactivityItemSource protocol. The difference is, you don’t have to implement those @required API for UIactivityItemSource protocol.

    Just add this line after you instantiate your UIActivityViewController:

    [activityController setValue:@"Your email Subject" forKey:@"subject"];
    

    I am using it like this:

    - (void)share {
        NSArray *activityItems;
    
        NSString *texttoshare = [NSString stringWithFormat:@"Hey bro! check this info.\n%@\n%@", self.infoBean.title, self.infoBean.desc];
        UIImage *imagetoshare = imageView.image;//this is your image to share
    
        if (imagetoshare != nil) {
        activityItems = @[imagetoshare, texttoshare];
        } else {
        activityItems = @[texttoshare];
        }
        NSArray *exTypes = @[UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeSaveToCameraRoll];
    
    
        UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
        activityController.excludedActivityTypes = exTypes;
    
    
        [activityController setValue:@"Your email Subject" forKey:@"subject"];
    
        [self presentViewController:activityController animated:YES completion:nil];
    }
    

    UIActivityItemProvider implements the UIActivityItemSource protocol. It’s right there in the header.

    @interface UIActivityItemProvider : NSOperation <UIActivityItemSource>
    

    so you can simply use the method - (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType to return the subject in your UIActivityItemProvider subclass.