Bug in TWTweetComposeViewController?

橙三吉。 提交于 2019-12-30 06:16:14

问题


I am using TWTweetComposeViewController, when available, to send tweets from inside my iOS app. I pre-populate the view controller with boilerplate text, then let the user modify and send at their discretion. It works great for the most part. Distilled down, it looks like this (with body pointing at a valid 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 */
}

Now if body is too long, i.e., more than 140 characters, the resulting tweet view is empty of any text at all, character countdown set to 140. I might have expected truncation in this case, although it does not appear to be documented in the Class Reference one way or the other what happens when the initial text is too long, but I can accept that I have to do the truncation to maximum tweet length before passing to setInitialText.

What I don't understand is that certain messages which are shorter than 140 characters also produce the empty tweet view.

Initially I saw what seemed to be a perfectly valid string with 139 characters failing. I noticed that shortening the string made it work. But after a great deal of experimenting, I also noticed that replacing a URL which happened to appear inside the text with random text of the same length made it work. In other words, the URL itself is causing a problem.

So I thought maybe there was something weird about the URL I was using, but I distilled it down to this. This one works:

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

while this does not

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

Observations:

  • They are both 140 characters long (and report that way in the console with [body length]). The only difference is the presence of something vaguely URL-like embedded in the middle of the second one.
  • The position of the URL within the string does not seem to matter, but if I change any one of those non-period characters to a period (thus making it not like a URL anymore), it ceases to be broken.
  • If I shorten the broken one, shaving 14 periods off the end, it works. That is, this particular URL embedded in periods for a total length of 126 characters is fine. 127 or larger is broken. Not clear how, or if, this relates to the length of the URL itself.

Anybody ever seen something like this? Any idea what is going on? Am I doing something wrong, or is the iOS Twitter Framework just broken?


回答1:


I have run into the exact same problem. It is a known bug in the Twitter framework and is being tracked.

Please see this discussion on dev.twitter.com https://dev.twitter.com/discussions/5024

(I would have posted that as a comment rather than an answer if I could, but I don't have sufficient SO credibility so thought I'd add the below observations as well in case they are of interest).

When just adding text without URLs, the character count works as expected. Adding a URL with the addURL: method causes 21 characters of the tweet to be used (20 for URL plus a space). Adding the URL in the initial text causes 20 chars to be used for the URL. When including a single URL (using either method) the framework fails when the total character count exceeds 138 (e.g. 20 for URL + space + 117 chars of initial text) thus losing 2 characters. With just one URL the order of setting the initial text and then adding the URL with addURL: does not make a difference.

When adding 2 URls, it fails when the total character count exceeds 113 this losing 27 characters! However, with 2 or more, if you add the URLs BEFORE setting the initial text, it fails with a total count of 136. So 2 chars are lost per URL again.

Summary/Workaround - if just including 1 URL then adding it in the initial text will give you one extra character than using the addURL: method, but you will still be short 2 characters overall. If adding 2 or more URLs using addURL: then add them before the initial text, but until the bug is fixed, you will still lose 2 chars per URL.

I have filed a radar, but according to this Can I browse other people's (Apple) bug reports?, the more times a bug is reported the higher priority it is given, so it is worth others filing it as well to increase it's priority.




回答2:


This seems to be a bug; I sure wish there was a way to directly ask TWTweetComposeViewController how much space is left. Fortunately there is an indirect way to ask. setInitialText: returns NO if the message is too long, so what I've done is brute-force it, chopping off five characters at a time until it returns 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];
}

I know, it's ugly, right? But at least it allows me to get a reasonable approximation of the max length, so that I truncate no more of the link title than I need to.




回答3:


Some code excerpt for automatic message trimming:

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



回答4:


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.




回答5:


I had similar problem. Twitter controller doesn't display tweets, that are too long. You can take a substring of a tweet by cutting down to 140 symbols:

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



回答6:


try this code

- (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;
}


来源:https://stackoverflow.com/questions/10241160/bug-in-twtweetcomposeviewcontroller

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!