How to set a mail Subject in UIActivityViewController?

39,492

Solution 1

It seems as though emreoktem's solution—sending setValue:forKey: to the UIActivityViewController—is undocumented.

On iOS 7 and later, you can implement the activityViewController:subjectForActivityType: method in an object conforming to the UIActivityItemSource protocol to do this in a way that is documented.

Solution 2

Check below code for the email for setting up your email subject:

UIActivityViewController* avc = [[UIActivityViewController alloc] initWithActivityItems:@[@"Your String to share"]
                                  applicationActivities:nil];
[avc setValue:@"Your email Subject" forKey:@"subject"];

avc.completionHandler = ^(NSString *activityType, BOOL completed) {
    // ...
};

Here the line

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

Makes the subject as "Your email Subject" if user picks email option in the UIActivityViewController.

I hope it helps...

Solution 3

Here's a concrete solution for Swift 3.0+ based on the accepted answer. Note that, like the accepted answer, this is known to work only on the iOS Mail app and not necessarily other apps.

Implementation:

class MessageWithSubject: NSObject, UIActivityItemSource {

    let subject:String
    let message:String

    init(subject: String, message: String) {
        self.subject = subject
        self.message = message

        super.init()
    }

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

    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
        return message
    }

    func activityViewController(_ activityViewController: UIActivityViewController,
                                subjectForActivityType activityType: UIActivityType?) -> String {
        return subject
    }
}

Usage:

Here's an example of usage. Note that it works well to use this as the first item in the activityItems array, and include any additional items to follow:

let message = MessageWithSubject(subject: "Here is the subject", message: "An introductory message")
let itemsToShare:[Any] = [ message, image, url, etc ]

let controller = UIActivityViewController(activityItems: itemsToShare, applicationActivities: nil)

Solution 4

For Swift 2.0+ & ios 8.0+

let title = "Title of the post"
let content = "Content of the post"
let objectsToShare = [title, content]

let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)      
activityVC.setValue(title, forKey: "Subject")
self.presentViewController(activityVC, animated: true, completion: nil)
Share:
39,492
Femina
Author by

Femina

Software Engineer Cum IOS Developer

Updated on July 05, 2022

Comments

  • Femina
    Femina almost 2 years

    I want to set subject for email sharing in UIActivityViewController and also want to share in Twitter. I know in Twitter if we want to share — we need compress text to 140 chars. I checked many SO solutions, but nothing is working.

    Is this issue fixed in latest iOS releases? Any other "working solutions"?

  • Femina
    Femina over 10 years
    [activityVC setCompletionHandler:^(NSString *activityType, BOOL completed) { if([activityType isEqualToString: UIActivityTypeMail]){ NSLog(@"Mail type selected"); [activityVC setValue:@"Share!" forKey:@"subject"]; } }]; Its not working emreoktem!
  • colinta
    colinta about 10 years
    @Meenu You should set the subject before the completion handler.
  • svarrall
    svarrall over 9 years
    This doesn't seem to be working in iOS8, is there another way of doing this?
  • Aanchal Chaurasia
    Aanchal Chaurasia about 9 years
    is There any way to set recipient also??
  • Claus
    Claus almost 9 years
    This and the activityViewController:subjectForActivityType: are annoyingly setting email subject and navigation bar title to the same string. It would be nice to have a official and documented way to do that.
  • Leslie Godwin
    Leslie Godwin almost 9 years
    Yes, activityViewController:subjectForActivityType: is the correct solution. Strangely the iOS Mail app uses the subject correctly but Google Inbox uses the message for the subject as well (not the subject supplied via subjectForActivityType)
  • Zalak Patel
    Zalak Patel about 8 years
    @LeslieGodwin Did you found any solution for sharing via gmail?
  • Zalak Patel
    Zalak Patel about 8 years
    @TimCamber Though I have tried above way it is still showing problem via sharing in gmail. Please help to resolve
  • Tim Arnold
    Tim Arnold about 8 years
    @jalakpatel I'm not sure what you are asking. Are you sharing something to the Google Gmail app? In that case, it may not be UIActivityViewController's fault that the Gmail app is not picking up activityViewController:subjectForActivityType:.
  • gadget00
    gadget00 almost 8 years
    does this work for sharing a link to a website? like [title, content, link] or does the URL has to be part of the content itself and let the email client parse it and make it clickable?
  • Ansal Antony
    Ansal Antony over 7 years
    but email subject is not showing when I am opening gmail application.I am getting Body content in Gmail Subject section
  • Timur Bernikovich
    Timur Bernikovich over 7 years
    It's undocumented and not preferred.
  • biomiker
    biomiker about 6 years
    Thank you, this is the correct answer. I've added an answer with a concrete class for Swift 3+ that I found very useful.
  • biomiker
    biomiker about 6 years
    Per the accepted answer, this is undocumented and unreliable.
  • Gal Bracha
    Gal Bracha over 5 years
    The following solution doesn't work for Gmail app but only for ios Mail app. On Gmail the body is being shown the same as a message subject
  • biomiker
    biomiker over 5 years
    That's true Gal, just like the accepted answer on which it is based. I added a comment to make that more explicit.
  • user2878850
    user2878850 over 5 years
    Class name should start with capital letter.
  • AndiAna
    AndiAna about 3 years
    One suggestion is to leave the 'title' off the objectsToShare, since adding the title in the setValue sets the Subject in the Email already. Works for me.