8

我正在尝试将文章标题和文章 URL 发布到 twitter,然后将应用程序的名称附加到推文的末尾。所以像

“如何种植仙人掌(通过@appname)”附加网址

我无法弄清楚如何平衡标题和 URL 的长度以确保推文不超过 140 个字符。因此,如果 URL 真的很长,请剪掉一些文章标题,使其不超过 140 个字符。

查看Twitter 的指南,SLComposeViewController他们说明了这一部分:

请注意,设置初始内容的方法以布尔值响应;这使您(开发人员)不必担心您正在初始化的推文正文中的当前字符数。如果该方法返回 YES,则有足够的空间来添加内容。如果该方法返回 NO,则您尝试添加的内容将导致推文长度超过 140 个字符。字符计数逻辑也会影响 t.co URL 换行所需的当前字符数。

(来自“代码示例”部分。)

鉴于此,我编写了以下代码来构建推文并平衡 URL 长度和文章长度:

if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) {
    SLComposeViewController *twitterViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    [twitterViewController addURL:[NSURL URLWithString:self.article.url]];

    NSString *titleToShare = self.article.title;
    while ([twitterViewController setInitialText:[NSString stringWithFormat:@"%@ (via @SyllableApp)", titleToShare]]) {
        titleToShare = [titleToShare substringToIndex:titleToShare.length - 1];
    }

    [self presentViewController:twitterViewController animated:YES completion:nil];
}

它基本上添加了 URL,然后通过循环该setInitialText:方法直到它返回来构造推文的其余部分,YES每次返回时将标题的长度减少 1 NO,以便更接近所需的长度。

但它永远不会返回YES!即使我知道它应该。我使用的一篇文章可能超过 140 个字符,因为标题长度为 105 个字符,URL 为 55,加上应用程序信用。所以理论上它应该能够缩短标题然后添加它,但它永远不会发生。

发生什么了?如何完成链接附件SLComposeViewController

4

4 回答 4

2

while ([twitterViewController setInitialText:[NSString stringWithFormat:@"%@ (via @SyllableApp)", titleToShare]]) => while (![twitterViewController setInitialText:[NSString stringWithFormat:@"%@ (via @SyllableApp)", titleToShare]])

有一个!状况不佳,因此您可以在合适的情况下缩短帖子,而不是在太长的情况下;)

于 2013-11-11T08:22:54.873 回答
1

The problem with this approach is that it works only on iOS6.

SLComposeViewController *social = [[SLComposeViewController alloc] init];
NSString *stringToShare = @"";
for (int i = 0; i < 150; i++)
{
    stringToShare = [stringToShare stringByAppendingString:@"x"];
}
NSLog(@"%@",[social setInitialText:stringToShare]?@"YES":@"NO");

yields different results on iOS6 (NO) and iOS7 (YES). The answer to this behaviour comes from the documentation of SLComposeViewController

// Sets the initial text to be posted. Returns NO if the sheet has already been
// presented to the user. On iOS 6.x, this returns NO if the specified text
// will not fit within the character space currently available; on iOS 7.0 and
// later, you may supply text with a length greater than the service supports,
// and the sheet will allow the user to edit it accordingly.
- (BOOL)setInitialText:(NSString *)text;

Probably is worth either having different approaches on iOS6 and 7, or check the length without using SLComposeViewController method.

于 2013-11-12T12:09:30.913 回答
0

存在一个未正确计算链接长度的错误(radar://10469407)。这可能是相关的。您可以尝试发送一条带有链接的推文,以检查正在使用哪个 URL 缩短器(我想它正在使用 t.co,但我可能是错的)。

于 2013-11-17T06:31:22.840 回答
0

正如 imihaly 所说,您确实错过了“!”。

并且 140 个字符数只是标题的限制,不包括 URL。所以你的标题是 105 个字符长,小于 140,这个方法应该返回 YES。

于 2013-11-15T04:00:50.647 回答