Bug en TWTweetComposeViewController?

Estoy usando TWTweetComposeViewController, cuando está disponible, para enviar tweets desde mi aplicación iOS. Recopilo el controller de vista con text repetitivo, luego permito que el usuario lo modifique y lo envíe a su discreción. Funciona muy bien en su mayor parte. Destilada hacia abajo, se ve así (con el body apuntando a un NSString válido):

 if (NSClassFromString(@"TWTweetComposeViewController")) { TWTweetComposeViewController *iOS5twitter = [[TWTweetComposeViewController alloc] init]; [iOS5twitter setInitialText:body]; iOS5twitter.completionHandler = ^(TWTweetComposeViewControllerResult result) { [self.viewController dismissViewControllerAnimated:YES completion:nil]; }; [self.viewController presentViewController:iOS5twitter animated:YES completion:nil]; [iOS5twitter release]; } else { /* Do something else when the framework is missing */ } 

Ahora, si el body es demasiado largo, es decir, más de 140 caracteres, la vista del tweet resultante está vacía de cualquier text, la count regresiva de los caracteres se establece en 140. Podría haber esperado el truncamiento en este caso, aunque no parece estar documentado en la Referencia de class, de una manera u otra, lo que ocurre cuando el text inicial es demasiado largo, pero puedo aceptar que tengo que hacer el truncamiento a la máxima longitud de tuit antes de pasar a setInitialText .

Lo que no entiendo es que ciertos posts que tienen más de 140 caracteres también producen la vista de tweets vacía.

Inicialmente vi lo que parecía ser una cadena perfectamente válida con 139 caracteres fallando. Noté que acortar la cadena hacía que funcione. Pero después de una gran cantidad de experimentos, también noté que replace una URL que aparecía dentro del text con text aleatorio de la misma longitud hacía que funcionara. En otras palabras, la URL misma está causando un problema.

Entonces pensé que tal vez había algo extraño en la URL que estaba usando, pero lo destilé a esto. Este funciona:

 NSString *body = @"............................................................................................................................................"; 

mientras que esto no

 NSString *body = @"............http://a........................................................................................................................"; 

Observaciones:

  • Ambos tienen 140 caracteres (e informan de esa manera en la console con [body length] ). La única diferencia es la presencia de algo vagamente similar a la URL embedded en el medio del segundo.
  • La position de la URL dentro de la cadena no parece importar, pero si cambio cualquiera de esos caracteres que no son de período a un punto (lo que hace que ya no sea como una URL), deja de romperse.
  • Si acorto la quebrada, afeitando 14 períodos del final, funciona. Es decir, esta URL particular incrustada en periodos para una longitud total de 126 caracteres está bien. 127 o mayor se rompe. No está claro cómo, o si, esto se relaciona con la longitud de la URL en sí.

¿Alguien ha visto algo así? ¿Alguna idea de lo que está pasando? ¿Estoy haciendo algo mal o el iOS Twitter Framework está roto?

Me he topado con el mismo problema. Es un error conocido en el marco de Twitter y está siendo rastreado.

Vea esta discusión en dev.twitter.com https://dev.twitter.com/discussions/5024

(Hubiera publicado eso como un comentario en lugar de una respuesta si pudiera, pero no tengo la suficiente cnetworkingibilidad de SO, así que pensé en agregar las observaciones a continuación también en caso de que sean de interés).

Al agregar text sin URL, el recuento de caracteres funciona como se esperaba. Al agregar una URL con el método addURL: el método hace que se usen 21 caracteres del tweet (20 para la URL más un espacio). Al agregar la URL en el text inicial, se utilizan 20 caracteres para la URL. Cuando se incluye una sola URL (utilizando cualquier método), el marco falla cuando el recuento total de caracteres supera 138 (por ejemplo, 20 para URL + espacio + 117 caracteres de text inicial), perdiendo así 2 caracteres. Con solo una URL, el order de configuration del text inicial y luego agregar la URL con addURL: no marca la diferencia.

Cuando agregue 2 URls, falla cuando el recuento total de caracteres supera los 113, ¡pierde 27 caracteres! Sin embargo, con 2 o más, si agrega las URL ANTES de establecer el text inicial, se produce un error con un recuento total de 136. Entonces se pierden 2 caracteres por URL.

Resumen / Solución: si solo incluye 1 URL, agregarlo en el text inicial le dará un carácter adicional que usar el método addURL: pero seguirá siendo breve de 2 caracteres en general. Si agrega 2 o más URL usando addURL: a continuación, agréguelas antes del text inicial, pero hasta que se corrija el error, aún perderá 2 caracteres por URL.

He archivado un radar, pero según esto ¿Puedo search informes de errores de otras personas (Apple)? , cuantas más veces se reporte un error mayor prioridad se le da, por lo que vale la pena que otros también lo hagan para boost su prioridad.

Esto parece ser un error; Estoy seguro de que desearía que hubiera una forma de preguntar directamente a TWTweetComposeViewController cuánto espacio queda. Afortunadamente, hay una forma indirecta de preguntar. setInitialText: devuelve NO si el post es demasiado largo, así que lo que he hecho es fuerza bruta, cortando cinco caracteres a la vez hasta que regrese YES :

 - (void)tweetURL:(NSString *)url title:(NSString *)title { TWTweetComposeViewController *twitter = [[TWTweetComposeViewController alloc] init]; NSString *format = @"“%@” %@ /via @DesignSceneApp"; NSString *message = [NSString stringWithFormat:format, title, url] NSUInteger idx = title.length; while (![twitter setInitialText:message]) { idx -= 5; if (idx > 5) { message = [NSString stringWithFormat:format, [NSString stringWithFormat:@"%@…", [title substringToIndex:idx]], url ]; } else { // Give up on the title. message = [NSString stringWithFormat:@"%@ /via @DesignSceneApp", url]; [twitter setInitialText:message]; break; } } [self presentViewController:twitter animated:YES completion:nil]; } 

Lo sé, es feo, ¿verdad? Pero al less me permite get una aproximación razonable de la longitud máxima, de modo que no trunca más del título del enlace del que necesito.

Algún extracto de código para el recorte automático de posts:

 [tweetSheet addURL:[NSURL URLWithString:@"http://some.nice.url/"]]; if (![tweetSheet setInitialText:message]) { NSUInteger messageMaxIndex = [message length]; while (messageMaxIndex > 0 && ![tweetSheet setInitialText:[NSString stringWithFormat: @"%@ ...", message]]) { --messageMaxIndex; message = [message substringToIndex:messageMaxIndex]; }; } 

En lugar de

 [iOS5twitter setInitialText:@"My url is http://something.com. No idea why it is not working"]; 

Prueba esto

 NSString *yourUrlString = @"http://something.com"; NSString *msg= @"My url is %@. No idea why it is not working"; NSString *defaultMessage = [NSString stringWithFormat:msg,yourUrlString]; [iOS5twitter setInitialText:defaultMessage]; 

No tengo idea de por qué es así, pero me enfrenté a este problema y lo probé y está funcionando para mí.

Tuve un problema similar El controller de Twitter no muestra los tweets, que son demasiado largos. Puede tomar una subcadena de un tweet networkinguciendo a 140 símbolos:

 [tweetView setInitialText:[self.textToExport substringToIndex:140]]; NSLog(@"tweetView.initialText:%@", [self.textToExport substringToIndex:140]); 

testing este codigo

 - (IBAction)DeveloperTwitter:(id)sender { NSString* tweet = @"some tweet goes here.."; if ([TWTweetComposeViewController canSendTweet]) { TWTweetComposeViewController *twitter = [[TWTweetComposeViewController alloc] init]; [twitter setInitialText:tweet]; [self presentViewController:twitter animated:YES completion:nil]; twitter.completionHandler = ^(TWTweetComposeViewControllerResult res) { if(res == TWTweetComposeViewControllerResultDone) { // sent ... } [self dismissModalViewControllerAnimated:YES]; }; } else { tweet = [NSString stringWithFormat:@"%@%@", @"http://twitter.com/home?status=", tweet]; tweet = [tweet stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[UIApplication shanetworkingApplication] openURL:[NSURL URLWithString: tweet]]; } tweet=nil; }