我正在使用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个字符,则生成的推文视图根本没有任何文本,字符倒计时设置为140.在这种情况下我可能预期会截断,尽管它似乎没有在类引用中以一种方式记录在初始文本太长时发生的事情,但是我可以接受在传递给setInitialText
之前我必须截断到最大的推文长度。< / p>
我不明白,某些 短于140个字符的邮件也会产生空的推文视图。
最初我看到似乎是一个完全有效的字符串,139个字符失败。我注意到缩短字符串使其工作。但是经过大量的实验,我还注意到用相同长度的随机文本替换碰巧出现在文本中的URL使其工作。换句话说,URL本身就是一个问题。
所以我想也许我正在使用的URL有些奇怪,但我把它提炼到了这个。这个有效:
NSString *body = @"............................................................................................................................................";
虽然这不是
NSString *body = @"............http://a........................................................................................................................";
观察:
[body length]
报告)。唯一的区别是在第二个中间嵌入了类似URL的东西。有人见过这样的东西吗?知道发生了什么事吗?我做错了什么,或者iOS Twitter框架刚刚破解?
答案 0 :(得分:9)
我遇到了完全相同的问题。它是Twitter框架中的一个已知错误,正在被跟踪。
请参阅dev.twitter.com https://dev.twitter.com/discussions/5024
上的讨论(如果可以的话,我会将其作为评论而不是答案发布,但我没有足够的SO可信度,所以我认为如果感兴趣的话我也会添加以下观察结果。)
当只添加没有URL的文本时,字符计数按预期工作。 使用addURL:方法添加URL会导致使用推文的21个字符(20个用于URL加空格)。在初始文本中添加URL会导致20个字符用于URL。 当包含单个URL(使用任一方法)时,当总字符数超过138(例如,URL +空格为20或初始文本的117个字符)时,框架将失败,从而丢失2个字符。只使用一个URL,设置初始文本然后使用addURL添加URL的顺序没有任何区别。
当添加2个URls时,当总字符数超过113而失去27个字符时,它会失败! 但是,对于2个或更多,如果您添加网址 BEFORE 设置初始文本,则会失败,总计数为136.因此,每个网址会丢失2个字符。
摘要/解决方法 - 如果仅包含1个URL然后在初始文本中添加它将比使用addURL:方法多出一个额外的字符,但总体上仍然会短2个字符。如果使用addURL添加2个或更多URL:然后在初始文本之前添加它们,但在修复错误之前,每个URL仍会丢失2个字符。
我已经提交了一个雷达,但根据这个Can I browse other people's (Apple) bug reports?,报告错误的次数越多,给出的优先级越高,因此值得其他人提交它以提高它的优先级。
答案 1 :(得分:3)
这似乎是一个错误;我确定希望有一种方法可以直接询问TWTweetComposeViewController剩余多少空间。幸运的是,有一种间接的方式可以提问。如果邮件太长,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];
}
我知道,这很难看,对吗?但至少它允许我得到一个合理的最大长度近似值,这样我就不会截断链接标题了。
答案 2 :(得分:1)
自动邮件修剪的一些代码摘录:
[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];
};
}
答案 3 :(得分:0)
而不是
[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];
我不知道为什么会这样,但我只是遇到了这个问题,并尝试了它,它对我有用。
答案 4 :(得分:0)
我有类似的问题。 Twitter控制器不显示推文,这太长了。您可以通过减少140个符号来获取推文的子字符串:
[tweetView setInitialText:[self.textToExport substringToIndex:140]];
NSLog(@"tweetView.initialText:%@", [self.textToExport substringToIndex:140]);
答案 5 :(得分:-1)
试试这段代码
- (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;
}