画像とテキストを含むTwitterフィードをTwitterウォールで共有したいと思いました。iOS4.3からiOS6.0.1へのサポートが必要です。送信/共有ボタンなしでバックグラウンドで共有することは可能ですか?どうすれば実装できますか?
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 リクエストが多数ある場合を除きます。その場合、代わりにNSOperationQueue
whereを選択します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 を割り当てます。最後に への呼び出しを行います。これにより、リクエストが非同期で実行されます。ACAccountStore
requestAccessToAccountsWithType:options:completion:
performRequestWithHandler
はい。ただし、あなたと承認者 (MGTWitter エンジンは正常に動作します) のために、1.1 API ラッパー (API 要求を生成し、それらを署名するものなど) を見つける必要があります。iOS 4+ のユーザー情報を共有 (テキストのみ) および取得するための実用的なソリューションがあります。
そして、バックグラウンド部分について-それをどのように実装するかによって異なります(つまり、通知または継続的なバックグラウンド実行または gps コールバックなど...)。
次のコードはバックグラウンドでは投稿されませんが、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 フィード投稿で不要なものを確認してください。願っています、これはあなたを助けるでしょう.