iOS 5 Twitter Framework: Tweeting sin la entrada y confirmación del usuario (controlador de vista modal)

Esencialmente, lo que quiero es que la aplicación, una vez que el usuario haya permitido el acceso a su cuenta de Twitter, pueda twittear todo lo que el usuario haya seleccionado en una UITableView . Idealmente, me gustaría utilizar el marco de Twitter en iOS 5, pero el principal problema que tengo es el controlador de vista modal para twittear. Es esto opcional? ¿Es posible tuitear sin él? Y si no, ¿qué sugieres que haga?

¡Gracias!

Sin duda, es posible tuitear sin él, lo siguiente es en las aplicaciones de producción iOS 5. Incluso lleva al usuario a la sección de preferencias necesaria si no ha registrado una cuenta.

 - (void)postToTwitter { // Create an account store object. ACAccountStore *accountStore = [[ACAccountStore alloc] init]; // Create an account type that ensures Twitter accounts are retrieved. ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; // Request access from the user to use their Twitter accounts. [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { if(granted) { // Get the list of Twitter accounts. NSArray *accountsArray = [accountStore accountsWithAccountType:accountType]; if ([accountsArray count] > 0) { // Grab the initial Twitter account to tweet from. ACAccount *twitterAccount = [accountsArray objectAtIndex:0]; TWRequest *postRequest = nil; postRequest = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://api.twitter.com/1/statuses/update.json"] parameters:[NSDictionary dictionaryWithObject:[self stringToPost] forKey:@"status"] requestMethod:TWRequestMethodPOST]; // Set the account used to post the tweet. [postRequest setAccount:twitterAccount]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^(void) { if ([urlResponse statusCode] == 200) { Alert(0, nil, @"Tweet Successful", @"Ok", nil); }else { Alert(0, nil, @"Tweet failed", @"Ok", nil); } }); }]; }); } else { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=TWITTER"]]; } } }]; } 

Esta sería una versión actualizada que utiliza SLRequest en lugar de TWRequest, que estaba en desuso en iOS 6. Tenga en cuenta que se necesita agregar el marco de Social y Cuentas a su proyecto …

 - (void) postToTwitterInBackground { // Create an account store object. ACAccountStore *accountStore = [[ACAccountStore alloc] init]; // Create an account type that ensures Twitter accounts are retrieved. ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; // Request access from the user to use their Twitter accounts. [accountStore requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) { if(granted) { // Get the list of Twitter accounts. NSArray *accountsArray = [accountStore accountsWithAccountType:accountType]; if ([accountsArray count] > 0) { // Grab the initial Twitter account to tweet from. ACAccount *twitterAccount = [accountsArray objectAtIndex:0]; SLRequest *postRequest = nil; // Post Text NSDictionary *message = @{@"status": @"Tweeting from my iOS app!"}; // URL NSURL *requestURL = [NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update.json"]; // Request postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:requestURL parameters:message]; // Set Account postRequest.account = twitterAccount; // Post [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { NSLog(@"Twitter HTTP response: %i", [urlResponse statusCode]); }]; } } }]; } 

Actualización: TwitterKit en Fabric by Twitter es bastante útil y si intentas publicar desde tu aplicación de Twitter cuando el usuario intenta hacer un Tweet en tu aplicación, entonces podría ser una buena opción para considerar.

(SÍ, este método le permitirá publicar en Twitter sin ningún cuadro de diálogo o confirmación).

El TwitterKit manejará la parte de permisos y con TWTRAPIClient ejecutaremos el tweet a través de las API de rest de Twitter.

  //Needs to performed once in order to get permissions from the user to post via your twitter app. [[Twitter sharedInstance]logInWithCompletion:^(TWTRSession *session, NSError *error) { //Session details can be obtained here //Get an instance of the TWTRAPIClient from the Twitter shared instance. (This is created using the credentials which was used to initialize twitter, the first time) TWTRAPIClient *client = [[Twitter sharedInstance]APIClient]; //Build the request that you want to launch using the API and the text to be tweeted. NSURLRequest *tweetRequest = [client URLRequestWithMethod:@"POST" URL:@"https://api.twitter.com/1.1/statuses/update.json" parameters:[NSDictionary dictionaryWithObjectsAndKeys:@"TEXT TO BE TWEETED", @"status", nil] error:&error]; //Perform this whenever you need to perform the tweet (REST API call) [client sendTwitterRequest:tweetRequest completion:^(NSURLResponse *response, NSData *data, NSError *connectionError) { //Check for the response and update UI according if necessary. }]; }]; 

Espero que esto ayude.

La respuesta aceptada ya no es válida debido a varios cambios. Éste funciona con iOS 10, Swift 3 y la versión 1.1 de la API de Twitter.

** ACTUALIZACIÓN **

Esta respuesta se ha actualizado ya que la anterior dependía de un punto final de Twitter en desuso.

 import Social import Accounts func postToTwitter() { let accountStore = ACAccountStore() let accountType = accountStore.accountType(withAccountTypeIdentifier: ACAccountTypeIdentifierTwitter) accountStore.requestAccessToAccounts(with: accountType, options: nil) { (granted, error) in if granted, let accounts = accountStore.accounts(with: accountType) { // This will default to the first account if they have more than one if let account = accounts.first as? ACAccount { let requestURL = URL(string: "https://api.twitter.com/1.1/statuses/update.json") let parameters = ["status" : "Tweet tweet"] guard let request = SLRequest(forServiceType: SLServiceTypeTwitter, requestMethod: .POST, url: requestURL, parameters: parameters) else { return } request.account = account request.perform(handler: { (data, response, error) in // Check to see if tweet was successful }) } else { // User does not have an available Twitter account } } } } 

Esta es la API que se está utilizando.