Pregunta

Me gustaría hacer una URL que haga clic en la aplicación de correo electrónico. El problema es que una URL parametrizada rompe esto debido a "y" en la URL. La variable del cuerpo a continuación es la línea de problemas. Ambas versiones del "cuerpo" son incorrectas. Una vez que se abre la aplicación de correo electrónico, el texto se detiene en "... enlace:". ¿Qué se necesita para codificar los ampersand?

NSString *subject = @"This is a test";
NSString *encodedSubject = 
[subject stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

//NSString *body = @"This is a link: <a href='http://somewhere.com/two.woa/wa?id=000&param=0'>click me</a>"; //original
NSString *body = @"This is a link: <a href='http://somewhere.com/two.woa/wa?id=000&#38;param=0'>click me</a>"; //have also tried &amp;
NSString *encodedBody = 
[body stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString *formattedURL = [NSString stringWithFormat: @"mailto:myname@somedomain.com?subject=%@&body=%@", encodedSubject, encodedBody];
NSURL *url = [[NSURL alloc] initWithString:formattedURL];
[[UIApplication sharedApplication] openURL:url];
¿Fue útil?

Solución

el amperandand serían %26 para hex en Codificación de URL estándares

Otros consejos

He estado usando -[NSString gtm_stringByEscapingForURLArgument], que se proporciona en Google Toolbox para Mac, específicamente en Gtmnsstring+urlarguments.h y Gtmnsstring+urlarguments.m.

Puede usar una representación hexadecimal del personaje, en este caso %26.

simplemente puedes usar CFURLCreateStringByAddingPercentEscapes con CFBridgingRelease por ARCO apoyo

NSString *subject = @"This is a test";
// Encode all the reserved characters, per RFC 3986
// (<http://www.ietf.org/rfc/rfc3986.txt>)
NSString *encodedSubject =
(NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                            (CFStringRef)subject,
                                            NULL,
                                            (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                            kCFStringEncodingUTF8));

Tu usas stringByAddingPercentEscapesUsingEncoding, exactamente como estás haciendo.

El problema es que no lo estás usando lo suficiente. El formato en el que estás insertando el cuerpo codificado además tiene un ampersand, que no has codificado. Atrae la cadena no codificada en su lugar y codifíquelos (usando stringByAddingPercentEscapesUsingEncoding) juntos.

<a href='http://somewhere.com/two.woa/wa?id=000&#38;param=0'>click me</a>

Es correcto, aunque '&' se usa más comúnmente que '&' o ','.

Si el método de 'stringByDingPermentesCapesusingEncoding' hace lo que dice en la lata, debería funcionar (*), pero la documentación NSString parece un poco poco clara de qué caracteres se escapan exactamente. Verifique con qué está terminando, la URL debería ser algo así como:

mailto:bob@example.com?subject=test&body=Link%3A%3Ca%20href%3D%22http%3A//example.com/script%3Fp1%3Da%26amp%3Bp2%3Db%22%3Elink%3C/a%3E

(*: Módulo El descargo de responsabilidad habitual que Mailto: Enlace Parámetros como 'sujeto' y 'cuerpo' no son estándar, fallarán en muchas situaciones y generalmente debe evitarse).

Una vez que se abre la aplicación de correo electrónico, el texto se detiene en "... enlace:".

Si 'StringByadingPermentesCapesusingEncoding' no se escapa '<' a '%3c', ese podría ser el problema. De lo contrario, podría no tener nada que ver con las escapadas, sino una restricción deliberada a nivel de correo para no permitir '<'. Como se mencionó anteriormente, "Body = ... no es una característica confiable.

En cualquier caso, no debe esperar que el correo reconozca el HTML e intente enviar un correo HTML; Muy pocos harán eso.

¡Ejemplo de uso de %26 en lugar de y sin estos atributos llegó a PHP como una matriz!

    var urlb='/tools/lister.php?type=101%26ID='+ID; // %26 instead of &
    window.location.href=urlb;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top