【问题标题】:Why am I unable to post to Twitter using SLComposeViewController?为什么我无法使用 SLComposeViewController 在 Twitter 上发帖?
【发布时间】:2013-11-14 17:11:08
【问题描述】:

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

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

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

看着Twitter's guidelines for SLComposeViewController,他们陈述了这部分:

请注意,设置初始内容的方法以布尔值响应;这使您(开发人员)不必担心您正在初始化的推文正文中的当前字符数。如果该方法返回 YES,则有足够的空间来添加内容。如果该方法返回 NO,则您尝试添加的内容将导致 Tweet 长度超过 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,每次返回 NO 时将标题的长度减少 1,以便更接近到所需的长度。

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

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

【问题讨论】:

  • 我在模拟器和 iPhone 5S 上运行了您的示例项目,在两种情况下(动画运行时)Xcode 都报告了 0% CPU。也许您需要重新启动某些东西(Xcode、设备、分机)?
  • 看来这是一个错误:openradar.appspot.com/14273967

标签: ios objective-c twitter slcomposeviewcontroller


【解决方案1】:

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

有一个!状态缺失,所以你可以在合适的时候缩短帖子,而不是在太长的时候;)

【讨论】:

  • 请检查循环前twitterViewControllertitleToShare 是否为nil。
【解决方案2】:

这种方法的问题是它只适用于 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");

在 iOS6 (NO) 和 iOS7 (YES) 上产生不同的结果。这种行为的答案来自于 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;

可能值得在 iOS6 和 7 上使用不同的方法,或者在不使用 SLComposeViewController 方法的情况下检查长度。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2015-08-07
        • 2013-10-09
        • 2014-01-07
        • 2014-09-12
        • 2013-08-29
        • 2018-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多