Wie lege ich einen E-Mail-Betreff in UIActivityViewController fest?


69

Ich möchte den Betreff für das Teilen von E-Mails festlegen UIActivityViewControllerund auch auf Twitter teilen. Ich weiß auf Twitter, ob wir teilen möchten - wir müssen Text auf 140 Zeichen komprimieren. Ich habe viele SO-Lösungen überprüft, aber nichts funktioniert.

Ist dieses Problem in den neuesten iOS-Versionen behoben? Irgendwelche anderen "funktionierenden Lösungen"?


Nein, das ist es nicht. Überprüfen Sie einfach meinen Kommentar unten und lassen Sie mich wissen, wenn ich den richtigen Weg vermisse. Vielen Dank
— Femina

Antworten:


90

Es scheint, als ob die Lösung von emreoktem - das Senden setValue:forKey:an die UIActivityViewController- nicht dokumentiert ist.

Unter iOS 7 und höher können Sie die activityViewController:subjectForActivityType:Methode in einem Objekt implementieren, das dem UIActivityItemSourceProtokoll entspricht, um dies auf dokumentierte Weise zu tun.


8
Ja, activityViewController:subjectForActivityType:ist die richtige Lösung. Seltsamerweise verwendet die iOS Mail-App den Betreff korrekt, aber Google Inbox verwendet die Nachricht auch für den Betreff (nicht den Betreff, der über bereitgestellt wird subjectForActivityType)
— Leslie Godwin

3
@LeslieGodwin Haben Sie eine Lösung für das Teilen über Google Mail gefunden?
— Zalak Patel

@ TimCamber Obwohl ich oben versucht habe, zeigt es immer noch Probleme durch das Teilen in Google Mail. Bitte helfen Sie zu lösen
— Zalak Patel

@ Jalakpatel Ich bin nicht sicher, was Sie fragen. Teilen Sie etwas mit der Google Google Mail-App? In diesem Fall ist es möglicherweise nicht die UIActivityViewControllerSchuld, dass die Google Mail-App nicht funktioniert activityViewController:subjectForActivityType:.
— Tim Arnold

Danke, das ist die richtige Antwort. Ich habe eine Antwort mit einer konkreten Klasse für Swift 3+ hinzugefügt, die ich sehr nützlich fand.
— Biomiker

94

Überprüfen Sie den folgenden Code für die E-Mail, um Ihren E-Mail-Betreff einzurichten:

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

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

Hier die Linie

[avc setValue: @ "Ihr E-Mail-Betreff" forKey: @ "Betreff"];

Legt den Betreff als "E-Mail-Betreff" fest, wenn der Benutzer die E-Mail-Option im UIActivityViewController auswählt.

Ich hoffe, es hilft...


1
[activityVC setCompletionHandler: ^ (NSString * activityType, BOOL abgeschlossen) {if ([activityType isEqualToString: UIActivityTypeMail]) {NSLog (@ "Mail type selected"); [activityVC setValue: @ "Teilen!" forKey: @ "subject"]; }}]; Es funktioniert nicht emreoktem!
— Femina

@Meenu Sie sollten den Betreff vor dem Abschluss-Handler festlegen .
— Colinta

3
Dies scheint in iOS8 nicht zu funktionieren. Gibt es eine andere Möglichkeit, dies zu tun?
— Svarrall

1
Dies und der activityViewController: subjectForActivityType: setzen den E-Mail-Betreff und den Titel der Navigationsleiste ärgerlicherweise auf dieselbe Zeichenfolge. Es wäre schön, einen offiziellen und dokumentierten Weg zu haben, dies zu tun.
— Claus

2
Aber der Betreff der E-Mail wird nicht angezeigt, wenn ich die Google Mail-Anwendung öffne. Ich erhalte Body-Inhalte im Abschnitt zum Betreff der Google Mail
— Ansal Antony

23

Hier ist eine konkrete Lösung für Swift 3.0+ basierend auf der akzeptierten Antwort. Beachten Sie, dass dies wie die akzeptierte Antwort nur für die iOS Mail-App und nicht unbedingt für andere Apps funktioniert.

Implementierung:

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

Verwendung:

Hier ist ein Anwendungsbeispiel. Beachten Sie, dass es gut funktioniert, dies als erstes Element im Array activityItems zu verwenden und alle folgenden zusätzlichen Elemente einzuschließen:

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)

1
Die folgende Lösung funktioniert nicht für die GmailApp, sondern nur für ios Mail app. In Google Mail wird der Körper genauso angezeigt wie ein Betreff der Nachricht
— Gal Bracha

Das ist wahr, Gal, genau wie die akzeptierte Antwort, auf der es basiert. Ich habe einen Kommentar hinzugefügt, um dies deutlicher zu machen.
— Biomiker

1
Der Klassenname sollte mit einem Großbuchstaben beginnen.
— user2878850

18

Für Swift 2.0+ und 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)

funktioniert dies zum Teilen eines Links zu einer Website? wie [Titel, Inhalt, Link] oder muss die URL Teil des Inhalts selbst sein und vom E-Mail-Client analysiert und anklickbar gemacht werden?
— Gadget00

Gemäß der akzeptierten Antwort ist dies nicht dokumentiert und unzuverlässig.
— Biomiker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.