5

画像とテキストを含むTwitterフィードをTwitterウォールで共有したいと思いました。iOS4.3からiOS6.0.1へのサポートが必要です。送信/共有ボタンなしでバックグラウンドで共有することは可能ですか?どうすれば実装できますか?

4

3 に答える 3

3

送信する必要がある API 呼び出しは次のとおりです。

https://dev.twitter.com/docs/api/1.1/post/statuses/update_with_media

もちろん、その呼び出しを行う前に、xAuth/OAuth を介して Twitter で認証する必要があります。Twitter から特別な許可を得ていない限り、OAuth を使用する必要がありそうですが、

https://dev.twitter.com/docs/oauth/xauth

リクエストをバックグラウンドで送信するには、Grand Central Dispatch を使用するのが理にかなっている可能性があります。これは、送信するさまざまな Twitter リクエストが多数ある場合を除きます。その場合、代わりにNSOperationQueuewhereを選択しますmaxConcurrentOperationCount = 1。以下を参照してください。

http://www.fieryrobot.com/blog/2010/06/27/a-simple-job-queue-with-grand-central-dispatch/

http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

とはいえ、OAuth は非常に面倒なので、サード パーティのライブラリを使用することはおそらく理にかなっています。これまで使ったことはありませんが、MGTwitterEngine を使用した例を次に示します。

Twitter の statuses/update_with_media が iOS で 500 エラーを返す

使用を iOS 5 以降に制限できた場合は、このSLRequestオブジェクトを使用することを強くお勧めします。このアプローチの利点は、iOS ユーザー アカウントと直接統合できるため、UIWebView などの安っぽい方法で認証する必要がないことです。

これを行うには、次の関数に適切な Twitter API URL をプラグインして、オブジェクトrequestForServiceType:requestMethod:URL:parameters:を取得しますSLRequest。次に、を使用してACAccount取得した適切な Twitter を割り当てます。最後に への呼び出しを行います。これにより、リクエストが非同期で実行されます。ACAccountStorerequestAccessToAccountsWithType:options:completion:performRequestWithHandler

于 2012-12-27T03:13:48.063 に答える
2

はい。ただし、あなたと承認者 (MGTWitter エンジンは正常に動作します) のために、1.1 API ラッパー (API 要求を生成し、それらを署名するものなど) を見つける必要があります。iOS 4+ のユーザー情報を共有 (テキストのみ) および取得するための実用的なソリューションがあります。

そして、バックグラウンド部分について-それをどのように実装するかによって異なります(つまり、通知または継続的なバックグラウンド実行または gps コールバックなど...)。

于 2012-12-21T10:49:44.537 に答える
2

次のコードはバックグラウンドでは投稿されませんが、iOS バージョン間で投稿できます...以下のコードのように iOS バージョンの条件を使用できます。これは私が実装した作業コードであり、iOS 5 と 6 の両方で動作しています。確認するios 4.動作するはずです。

#import "Twitter/Twitter.h"
#import "Social/Social.h"

-(IBAction)tweetPost:(id)sender
{
 if ([self  isSocialAvailable])
 {
  SLComposeViewController *tweetComposer=[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];

  if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) {
   SLComposeViewControllerCompletionHandler __block completionHandler=
   ^(SLComposeViewControllerResult result){

    [tweetComposer dismissViewControllerAnimated:YES completion:nil];

    switch(result){
     case SLComposeViewControllerResultCancelled:
     default:
     {
      NSLog(@"Cancelled.....");
     }
      break;
     case SLComposeViewControllerResultDone:
     {
      NSLog(@"Posted....");
      UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Sent"
                                                       message:nil
                                                      delegate:nil
                                             cancelButtonTitle:@"Dismiss"
                                             otherButtonTitles: nil];
      [alert show];
     }
      break;
    }};
   NSString*message = @"posting to twitter test ios 6";
   [tweetComposer setInitialText:message];
   [tweetComposer addImage:[UIImage imageNamed:@"2.jpg"]];
   [tweetComposer addURL:[NSURL URLWithString:@"http://www.youtube.com/watch?v=GoZ2Be2zLq8"]];

   [tweetComposer setCompletionHandler:completionHandler];
   [self presentViewController:tweetComposer animated:YES completion:nil];
  }
 }
 else
 {
  TWTweetComposeViewController *twitter= [[TWTweetComposeViewController alloc] init];

  [twitter addImage:[UIImage imageNamed:@"2.jpg"]];
  [twitter addURL:[NSURL URLWithString:@"http://www.youtube.com/watch?v=GoZ2Be2zLq8"]];
  [twitter setInitialText:@"Tweet from iOS 5 app using the Twitter framework."];

  [self presentModalViewController:twitter animated:YES];

  twitter.completionHandler = ^(TWTweetComposeViewControllerResult result)
  {
   NSString *title = @"Tweet Status";
   NSString *msg;

   if (result == TWTweetComposeViewControllerResultCancelled)
    msg = @"Tweet compostion was canceled.";
   else if (result == TWTweetComposeViewControllerResultDone)
    msg = @"Tweet composition completed.";

   // Show alert to see how things went...
   UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil];
   [alertView show];
  };
 }
}


-(BOOL)isSocialAvailable {
 return NSClassFromString(@"SLComposeViewController") != nil;
}

social、adSupport、Accounts という名前の 3 つのフレームワークを含める必要があります。Twitter フィード投稿で不要なものを確認してください。願っています、これはあなたを助けるでしょう.

于 2012-12-28T06:23:33.363 に答える