UIActivityViewController con HTML
Pregunta
Cuando paso una cadena que contiene contenido HTML como un elemento de matriz al UIActivityViewController initWithActivityItems
método, no lo presenta como HTML en el controlador 'compartir' seleccionado, sino que presenta la fuente HTML (es decir,el marcado en lugar de interpretarlo).
Y aunque puedo entender por qué haría esto para destinos compartidos que no admiten contenido html, tampoco lo interpretará para cosas como el correo electrónico, que sí lo hacen (anteriormente, esto se hacía configurando el isHTML
propiedad a YES
sobre el MFMailComposeController
).
¿Debería perder el tiempo creando un UIActivityItemProvider
que devuelve contenido personalizado basado en el 'tipo de actividad' o realmente no hay manera de que el controlador de correo sea presentado por el UIActivityViewController
interpretar el contenido como HTML?
Solución
¿Qué actividades buscas apoyar?Los tipos de actividad dependen del servicio y son bastante claramente definido.No hay forma de que los servicios sepan que una cadena es texto sin formato o texto marcado, por ejemplo; es posible que desee pegar código HTML a propósito.
Siempre puedes hacer las cosas a la antigua usanza y copiar texto plano y HTML al tablero, o llamar directamente al redactor del correo, o lo que sea que estés intentando lograr.
Otros consejos
En mis pruebas, si la cadena comienza con "<html><body>" y termina con "</body></html>", se trata como HTML.
Si desea obtener un buen resultado con los servicios para compartir que no son compatibles con HTML, debe utilizar un objeto que implemente el UIActivityItemFuente protocolo y devuelve la cadena HTML cuando desde -activityViewControllerPlaceholderItem:
y de -activityViewController:itemForActivityType:
si la actividad es UIActivityTypeMail
y nil
de lo contrario.
Un segundo UIActivityItemFuente que devuelve una cadena no HTML adecuada de -activityViewControllerPlaceholderItem:
y de -activityViewController:itemForActivityType:
si la actividad no es UIActivityTypeMail
(y nil
si es así) es el resto del rompecabezas.
Recomiendo no tener un objeto que haga ambos trabajos, ya que el UIActivity
El motor tiene derecho a tomar diferentes decisiones en función de si el elemento del marcador de posición parece ser HTML o no.
No he probado ninguno de estos, pero me parecieron razonables para su objetivo cuando me familiaricé con UIActivityViewController.
1) Puede escribir la fuente HTML en un archivo local, por ejemplo, my_mail_message.html
, luego construye un NSURL
objeto con ese archivo, por ejemplo, [NSURL URLWithString:@"file://my_mail_message.html"]
, y luego usar eso NSURL
objeto como elemento del activityItems
matriz a la que alimentas initWithActivityItems:applicationActivities:
.
2) Si conoce al destinatario previsto, por ejemplo, foo@example.com
, posiblemente podrías construir un NSURL
objeto con el mailto
esquema y la fuente HTML como el body
, al igual que: mailto:foo@example.com?body={my HTML source goes here}
.Deberías omitir las llaves. {}
.Como antes, entonces deberías usar eso. NSURL
objeto como elemento del activityItems
formación.
Espero que esto te dé algunas ideas.
Sólo necesitas asegurarte de que la primera línea de la cadena HTML sea una etiqueta.