8

我正在使用 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.

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

最初,我看到似乎是一个完全有效的字符串,但有 139 个字符失败。我注意到缩短字符串使它起作用。但经过大量试验后,我还注意到,用相同长度的随机文本替换恰好出现在文本中的 URL 可以正常工作。换句话说,URL 本身就是一个问题。

所以我想我使用的 URL 可能有些奇怪,但我把它提炼成这个。这个有效:

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

虽然这不是

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

观察:

  • 它们都是 140 个字符长(并在控制台中使用 以这种方式报告[body length])。唯一的区别是在第二个中间嵌入了一些模糊的类似 URL 的东西。
  • URL 在字符串中的位置似乎无关紧要,但是如果我将这些非句点字符中的任何一个更改为句点(从而使其不再像 URL),它就不会被破坏。
  • 如果我缩短损坏的那一个,从末尾剃掉 14 个周期,它就可以工作。也就是说,这个特殊的 URL 嵌入在句点中,总长度为 126 个字符。127 或更大的已损坏。不清楚这如何或是否与 URL 本身的长度有关。

有人见过这样的东西吗?知道发生了什么吗?我做错了什么,还是 iOS Twitter 框架刚刚坏了?

4

6 回答 6

9

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

请在 dev.twitter.com 上查看此讨论https://dev.twitter.com/discussions/5024

(如果可以的话,我会把它作为评论而不是答案发布,但我没有足够的可信度,所以我想我也会添加以下观察结果,以防它们感兴趣)。

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

添加 2 个 URls 时,当总字符数超过 113 时失败,这会丢失 27 个字符!但是,如果有 2 个或更多,如果在设置初始文本之前添加 URL ,它会失败,总数为 136。因此每个 URL 再次丢失 2 个字符。

摘要/解决方法 - 如果只包含 1 个 URL,那么在初始文本中添加它会比使用 addURL: 方法多出一个字符,但总体上仍然会短 2 个字符。如果使用 addURL: 添加 2 个或更多 URL,则在初始文本之前添加它们,但在修复错误之前,每个 URL 仍然会丢失 2 个字符。

我已经提交了雷达,但是根据这个我可以浏览其他人(Apple)的错误报告吗?,错误报告的次数越多,它的优先级就越高,因此值得其他人提交它以提高它的优先级。

于 2012-09-03T17:26:50.313 回答
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];
}

我知道,这很丑,对吧?但至少它允许我获得最大长度的合理近似值,这样我就不会截断超出我需要的链接标题。

于 2012-08-30T07:41:04.080 回答
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];
    };
}
于 2013-06-10T12:48:05.037 回答
0

Instead of

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

Try this

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

I have no idea why it is so but I just faced this problem and tried it and it is working for me.

于 2012-04-25T16:11:19.890 回答
0

我有类似的问题。Twitter 控制器不显示太长的推文。您可以通过减少到 140 个符号来获取推文的子字符串:

[tweetView setInitialText:[self.textToExport substringToIndex:140]];
NSLog(@"tweetView.initialText:%@", [self.textToExport substringToIndex:140]);
于 2012-07-02T18:52:10.097 回答
-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;
}
于 2012-06-10T00:02:12.293 回答