UIActivityViewController avec HTML
Question
Lorsque je transmets une chaîne contenant du contenu HTML en tant qu'élément de tableau au UIActivityViewController initWithActivityItems
méthode, il ne le présente pas au format HTML dans le contrôleur « partage » sélectionné, mais présente à la place la source HTML (c'est-à-direle balisage plutôt que de l’interpréter).
Et bien que je puisse comprendre pourquoi il ferait cela pour les cibles de partage qui ne prennent pas en charge le contenu HTML, il ne l'interprétera pas non plus pour des choses comme le courrier électronique, qui le font (auparavant, cela se faisait en définissant le isHTML
propriété à YES
sur le MFMailComposeController
).
Dois-je perdre mon temps à créer un UIActivityItemProvider
qui renvoie un contenu personnalisé basé sur le « type d'activité » ou n'y a-t-il vraiment aucun moyen d'obtenir le contrôleur de messagerie présenté par le UIActivityViewController
interpréter le contenu au format HTML ?
La solution
Quelles activités cherchez-vous à soutenir ?Les types d'activités dépendent du service et ils sont jolis clairement défini.Les services n'ont aucun moyen de savoir qu'une chaîne est du texte brut ou du texte balisé, par exemple : vous souhaiterez peut-être coller du code HTML volontairement.
Vous pouvez toujours faire les choses à l'ancienne et copier du texte brut et du HTML dans le presse-papiers, ou appeler directement le compositeur de courrier, ou tout ce que vous essayez d'accomplir.
Autres conseils
Lors de mes tests, si la chaîne commence par "<html><body>" et se termine par "</body></html>", elle est traitée comme du HTML.
Si vous souhaitez un bon résultat avec les services de partage non compatibles HTML, vous devez plutôt utiliser un objet qui implémente le UIActivityItemSource protocole et renvoie la chaîne HTML à partir de -activityViewControllerPlaceholderItem:
et de -activityViewController:itemForActivityType:
si l'activité est UIActivityTypeMail
et nil
sinon.
Une seconde UIActivityItemSource qui renvoie une chaîne non HTML appropriée à partir de -activityViewControllerPlaceholderItem:
et de -activityViewController:itemForActivityType:
si l'activité n'est pas UIActivityTypeMail
(et nil
si c'est le cas), c'est le reste du puzzle.
Je déconseille qu'un seul objet fasse les deux tâches, car le UIActivity
Le moteur est autorisé à prendre des décisions différentes selon que l'élément d'espace réservé semble être HTML ou non.
Je n'ai essayé aucun de ces éléments, mais ils semblaient raisonnables pour votre objectif lorsque je me familiarisais avec UIActivityViewController.
1) Vous pouvez écrire la source HTML dans un fichier local, par exemple : my_mail_message.html
, puis construisez un NSURL
objet avec ce fichier, par exemple, [NSURL URLWithString:@"file://my_mail_message.html"]
, puis utilisez-le NSURL
objet en tant qu'élément du activityItems
tableau auquel vous alimentez initWithActivityItems:applicationActivities:
.
2) Si vous connaissez le destinataire prévu, par ex. foo@example.com
, vous pourriez éventuellement construire un NSURL
objet avec le mailto
schéma et la source HTML comme body
, ainsi: mailto:foo@example.com?body={my HTML source goes here}
.Vous devriez omettre les accolades {}
.Comme auparavant, vous devriez alors l'utiliser NSURL
objet en tant qu'élément du activityItems
tableau.
J'espère que cela vous donne quelques idées.
Vous devez simplement vous assurer que la première ligne de la chaîne HTML est une balise.