TWTweetComposeViewController中的错误?

我使用的TWTweetComposeViewController,可用时,从我的iOS应用程序内发送鸣叫。 我预先用样板文本填充视图控制器,然后让用户自行修改和发送。 它在很大程度上很好用。 蒸馏下来,它看起来像这样( body指向一个有效的NSString ):

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

现在,如果body太长,即超过140个字符,则所得到的tweet视图中根本没有任何文本,字符倒数设置为140.在这种情况下,我可能期望截断,虽然它似乎没有logging在类参考一种方式,或者当初始文本太长时会发生什么,但是我可以接受的是,在传递给setInitialText之前,我必须截断最大的tweet长度。

我不明白的是某些短于140个字符的消息也会产生空的推文视图。

起初,我看到了139个字符失败的似乎是完全有效的string。 我注意到缩短了string使它工作。 但经过大量的实验后,我也注意到用同样长度的随机文本replace正好出现在文本内部的URL使其工作。 换句话说,URL本身就是一个问题。

所以我想也许有一些关于我使用的url有点奇怪,但是我把它解释成这个。 这个工作:

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

而这不是

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

观察:

  • 他们都是140个字符长(并在控制台以[body length] )。 唯一的区别是在第二个中间embedded了类似URL的东西。
  • 在string中的URL的位置似乎并不重要,但如果我将这些非句点字符中的任何一个更改为一个句点(从而使它不再像URL一样),它就不再被打破。
  • 如果我缩短了这个破损的一个,那么结束十四个周期就可以了。 也就是说,这个特定的urlembedded在126个字符的总长度的罚款。 127或更大的是打破。 不清楚如何或如果,这与URL本身的长度有关。

有人见过这样的事吗? 任何想法是怎么回事? 我做错了什么,或者iOS的Twitter框架刚刚坏了?

我遇到了完全一样的问题。 这是Twitter框架中的一个已知错误,正在被追踪。

请参阅dev.twitter.com上的讨论https://dev.twitter.com/discussions/5024

(如果可以的话,我会张贴这个评论而不是一个答案,但我没有足够的可信度,所以我想添加下面的观察以及他们感兴趣的情况)。

当只添加没有URL的文本时,字符计数按预期工作。 使用addURL:方法添加URL会导致使用21个推文字符(对于URL加上20个空格)。 在初始文本中添加URL会导致URL使用20个字符。 当包含单个URL(使用任一方法)时,如果总字符数超过138(例如,URL +空格为20 +初始文本为117个字符),则框架失败,从而丢失2个字符。 只有一个URL,设置初始文本的顺序,然后用addURL添加URL:没有什么区别。

当添加2个URls时,当总字符数超过113时失败,失去27个字符! 但是,如果您在添加2个或多个URL 之前添加了设置初始文本之前的URL,那么它将失败,总数为136.因此,每个URL再次丢失2个字符。

总结/解决方法 – 如果只包含1个URL,那么在初始文本中添加1个URL会比使用addURL:方法提供额外的字符,但总体上仍然是2个字符。 如果使用addURL添加2个或更多的URL:然后将它们添加到初始文本之前,但是直到错误被修复,每个URL仍然会丢失2个字符。

我已经提交了一个雷达,但根据这个我可以浏览其他人(苹果)的错误报告? ,报告错误的次数越多,给予的优先级就越高,所以其他人也应该提交,以提高优先级。

这似乎是一个错误; 我当然希望有一种方法可以直接问TWTweetComposeViewController剩下多less空间。 幸运的是有一个间接的方法来问。 setInitialText:如果消息太长,则返回NO ,所以我所做的是蛮力,每次斩掉五个字符,直到返回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]; } 

我知道,这很丑陋,对吧? 但至less它可以让我得到一个合理的最大长度的近似值,这样我就不会比我需要的截断更多的链接标题。

一些代码摘录自动消息修剪:

 [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]; }; } 

代替

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

尝试这个

 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]; 

我不知道为什么是这样,但我只是面临这个问题,并尝试它,它是为我工作。

我有类似的问题。 Twitter控制器不显示推文,这太长了。 您可以通过减less140个符号来获取推文的子string:

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

试试这个代码

 - (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 sharedApplication] openURL:[NSURL URLWithString: tweet]]; } tweet=nil; }