iOS 5 Twitter Framework: twittear sin input y confirmación del usuario (controller de vista modal)

Básicamente, lo que quiero es que la aplicación, una vez que el usuario haya permitido el acceso a su count de Twitter, pueda twittear lo que el usuario haya seleccionado en una UITableView . Lo ideal sería utilizar el marco de Twitter en iOS 5, pero el problema principal que estoy teniendo es el controller de vista modal para twittear. ¿Es opcional? ¿Es posible twittear sin él y si no, qué sugieres que haga?

¡Gracias!

Definitivamente es posible twittear sin él, lo siguiente es en la producción de aplicaciones iOS 5. Incluso lleva al usuario a la sección de preferences requerida si no ha registrado una count.

 - (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 shanetworkingApplication] openURL:[NSURL URLWithString:@"prefs:root=TWITTER"]]; } } }]; } 

Esta sería una versión actualizada utilizando SLRequest en lugar de TWRequest, que estaba en desuso en iOS 6. Tenga en count que esto necesita el marco social y de counts que se agregará 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 muy útil y si tiene como objective publicar desde su aplicación de Twitter cuando el usuario intenta Tweetear en su aplicación, entonces podría ser una buena opción para considerar.

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

El TwitterKit se encargará de la parte de permissions y, utilizando el TWTRAPIClient, realizaremos el tweet a través de las API de Twitter rest.

  //Needs to performed once in order to get permissions from the user to post via your twitter app. [[Twitter shanetworkingInstance]logInWithCompletion:^(TWTRSession *session, NSError *error) { //Session details can be obtained here //Get an instance of the TWTRAPIClient from the Twitter shanetworking instance. (This is created using the cnetworkingentials which was used to initialize twitter, the first time) TWTRAPIClient *client = [[Twitter shanetworkingInstance]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. Este funciona con iOS 10, Swift 3 y la versión 1.1 de la API de Twitter.

** ACTUALIZACIÓN **

Esta respuesta se ha actualizado como la anterior se basó en 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.