devdoe
devdoe

Reputation: 4325

Posting tweet with new api (1.1) in iOS

Since the twitter api is changed my app no longer posts tweet. Every thing was working fine before and according to new API only request pattern should change ? All the other stuff initialising the engine and rest should be same ?

And the method for sharing should be modified, so I modified it but getting "Bad Authentication 215". All the token info and other things I got it from the authentication header generated from twitter itself:

- (void) shareOnTwitter
{         
    NSString *urlString = [NSString stringWithFormat:@"https://api.twitter.com/1.1/statuses/update.json"];

    NSURL *url = [NSURL URLWithString:urlString];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

    [request setHTTPMethod:@"POST"];

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

    [dict setValue:@"check Check CHECK" forKey:@"status"];

    [dict setValue:@"-- - - - - -" forKey:@"oauth_consumer_key"];

    [dict setValue:@"- - - - - - -" forKey:@"oauth_nonce"];

    [dict setValue:@"- - - - - - -" forKey:@"oauth_signature"];

    [dict setValue:@"HMAC-SHA1" forKey:@"oauth_signature_method"];

    [dict setValue:@"- - - - - - -" forKey:@"oauth_timestamp"];

    [dict setValue:@"- - - - - - -" forKey:@"oauth_token"];

    [dict setValue:@"1.0" forKey:@"oauth_version"];

    NSString *jsonString = [dict JSONRepresentation];

    NSData *jsonData = [NSData dataWithBytes:[jsonString UTF8String] length:jsonString.length];

    [request setHTTPBody:jsonData];

    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

    NSLog(@"My request...%@", jsonString);

    NSData *urlData;

    NSURLResponse *response1;

    NSError *error = nil;

    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response1 error:&error];

    if(error)
    {
        NSLog(@"Error %@",error);
    }

    if(!urlData)
    {
        NSLog(@"No connection!");
    }

    NSString *responseStr = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];

    NSLog(@" Twitter : ... %@", responseStr);
}

Upvotes: 0

Views: 1646

Answers (2)

devdoe
devdoe

Reputation: 4325

Twitter explained every thing in its new documentation from Authentication to loads of trivial things but no easy way for previous apps using 1.0 api, how to post a tweet or to upgrade.

Few changes to make it work (works for OAuth):

Open the MGTwitterEngine.m >

Make sure the macros are defined like this:

#define TWITTER_DOMAIN          @"api.twitter.com/1.1"
#define HTTP_POST_METHOD        @"POST"
#define TWITTER_SEARCH_DOMAIN   @"search.twitter.com"
#define DEFAULT_CLIENT_VERSION  @"1.0"


#if YAJL_AVAILABLE
    #define API_FORMAT @"xml"

    #import "MGTwitterStatusesYAJLParser.h"
    #import "MGTwitterMessagesYAJLParser.h"
    #import "MGTwitterUsersYAJLParser.h"
    #import "MGTwitterMiscYAJLParser.h"
    #import "MGTwitterSearchYAJLParser.h"
#else
    #define API_FORMAT @"json"

    #if USE_LIBXML
        #import "MGTwitterStatusesLibXMLParser.h"
        #import "MGTwitterMessagesLibXMLParser.h"
        #import "MGTwitterUsersLibXMLParser.h"
        #import "MGTwitterMiscLibXMLParser.h"
    #else
        #import "MGTwitterStatusesParser.h"
        #import "MGTwitterUsersParser.h"
        #import "MGTwitterMessagesParser.h"
        #import "MGTwitterMiscParser.h"
    #endif
#endif

You will be surprised that - (void) requestSucceeded: (NSString *) requestIdentifier and - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) error will be called. But it is pretty easy to put a check that if succeeded is called than don't do anything in failed method.

Upvotes: 0

Maulik
Maulik

Reputation: 19418

Try below code. Its worked for me :

    ACAccountStore *accountStore = [[ACAccountStore alloc] init];
    ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error)
     {
         if (granted)
         {
             NSArray *accounts = [accountStore accountsWithAccountType:accountType];
             if (accounts.count)
             {
                 NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
                 [dict setValue:@"check Check CHECK" forKey:@"status"];

                 NSString *retweetString = [NSString stringWithFormat:@"https://api.twitter.com/1.1/statuses/update.json"];
                 NSURL *retweetURL = [NSURL URLWithString:retweetString];
                 TWRequest *request = [[TWRequest alloc] initWithURL:retweetURL parameters:dict requestMethod:TWRequestMethodPOST];
                 request.account = [accounts objectAtIndex:0];

                 [request performRequestWithHandler:^(NSData *responseData1, NSHTTPURLResponse *urlResponse, NSError *error)
                  {
                      if (responseData1)
                      {
                          NSError *error1 = nil;
                          id response = [NSJSONSerialization JSONObjectWithData:responseData1 options:NSJSONReadingMutableLeaves error:&error1];
                      }
                  }];
             }
         }

     }];

Upvotes: 4

Related Questions