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])。唯一の違いは、2番目のURLの真ん中に漠然とURLのようなものが埋め込まれていることです。
  • 文字列内のURLの位置は重要ではないようですが、これらの非ピリオド文字のいずれかをピリオドに変更すると(したがって、URLのようになりません)、壊れなくなります。
  • 壊れたものを短くして、最後から14ピリオドを削ると、うまくいきます。つまり、合計126文字のピリオドに埋め込まれたこの特定のURLは問題ありません。127以上が壊れています。これがURL自体の長さにどのように関係しているか、または関係しているかどうかは不明です。

誰かがこのようなものを見たことがありますか?何が起こっているのか分かりますか?私は何か間違ったことをしていますか、それともiOS Twitter Frameworkが壊れていますか?

4

6 に答える 6

9

私はまったく同じ問題に遭遇しました。これはTwitterフレームワークの既知のバグであり、追跡されています。

dev.twitter.comhttps : //dev.twitter.com/discussions/5024でこのディスカッションを参照してください

(できれば回答ではなくコメントとして投稿したと思いますが、SOの信頼性が十分ではないので、興味がある場合は以下の所見も追加したいと思います)。

URLなしでテキストを追加するだけの場合、文字数は期待どおりに機能します。addURL:メソッドを使用してURLを追加すると、ツイートの21文字が使用されます(URLとスペースの場合は20文字)。最初のテキストにURLを追加すると、URLに20文字が使用されます。単一のURLを含める場合(いずれかの方法を使用)、合計文字数が138を超えるとフレームワークが失敗し(たとえば、URL +スペース+初期テキストの117文字の場合は20)、2文字が失われます。URLが1つしかない場合、最初のテキストを設定してからaddURL:を使用してURLを追加する順序は、違いはありません。

2つのURを追加する場合、合計文字数が113を超えると失敗し、27文字が失われます。ただし、2つ以上の場合、最初のテキストを設定する前にURLを追加する、合計136のカウントで失敗します。したがって、URLごとに2文字が再び失われます。

要約/回避策-1つのURLを含めるだけの場合、最初のテキストにそれを追加すると、addURL:メソッドを使用するよりも1文字余分になりますが、全体として2文字短くなります。addURLを使用して2つ以上のURLを追加する場合:最初のテキストの前にそれらを追加しますが、バグが修正されるまで、URLごとに2文字が失われます。

レーダーを提出しましたが、これによると、他の人(Apple)のバグレポートを閲覧できますか?、バグが報告される回数が多いほど、優先度が高くなるため、他の人もバグを提出して優先度を上げる価値があります。

于 2012-09-03T17:26:50.313 に答える
3

これはバグのようです。TWTweetComposeViewControllerに残りのスペースを直接尋ねる方法があればいいのにと思います。幸いなことに、質問する間接的な方法があります。setInitialText:メッセージが長すぎる場合はが返さNOれるので、私が行ったことは、メッセージが返されるまで一度に5文字ずつ切り刻んで、ブルートフォース攻撃を行うことです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

それ以外の

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

なぜそうなのかわかりませんが、この問題に直面して試してみたところ、うまくいきました。

于 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 に答える