Retrieving twitter user data with iOS Social / Accounts frameworks

7.7k views Asked by At

Is there a way to get user data (first name, last name, and email) from Twitter using the iOS social/accounts frameworks? I'm able to do it with Facebook, but every SLRequest I make to Twitter returns an empty array.

Here's the code I've got right now. I've tried several URLS with varying parameters, but I haven't had any luck.

- (void)populateTwitterAccount  {
NSURL *twitterURL = [NSURL URLWithString:@"https://api.twitbridge.com/1.1/users/show.json"];

SLRequest *twitterRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:twitterURL parameters:nil];

[twitterRequest setAccount:self.twitterAccount];

[twitterRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
    NSString *accountDataString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    
    NSLog(@"%@", accountDataString);
    
}];

}
2

There are 2 answers

5
Toseef Khilji On BEST ANSWER

Yes, you can get user information using ACAccountStore, You have to retain ACAccountStore: .h

@property (nonatomic, strong) ACAccountStore *account;

.m

  NSUrl *url = [NSURL URLWithString:@"https://api.twitter.com/1.1/users/show.json"];
  NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:twittername,@"screen_name",nil];

     account = [[ACAccountStore alloc] init];
    ACAccountType *twitterAccountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    NSArray *twitterAccounts = [account accountsWithAccountType:twitterAccountType];

    // Runing on iOS 6
    if (NSClassFromString(@"SLComposeViewController") && [SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])
    {
        [account requestAccessToAccountsWithType:twitterAccountType options:NULL completion:^(BOOL granted, NSError *error)
         {
             if (granted)
             {

                 SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:url                                      parameters:params];

                 [request setAccount:[twitterAccounts lastObject]];

                 dispatch_async(dispatch_get_main_queue(), ^
                                {

                                    [NSURLConnection sendAsynchronousRequest:request.preparedURLRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response1, NSData *data, NSError *error)
                                     {
                                         dispatch_async(dispatch_get_main_queue(), ^
                                                        {
                                                            if (data)
                                                            {
//                                                                [self loadData:data];

                                                                NSString* newStr = [[NSString alloc] initWithData:data
                                                                                                          encoding:NSUTF8StringEncoding];
                                                                NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] ;


                                                                NSLog(@"data:%@",newStr);
                                                            }
                                                        });
                                     }];
                                });
             }
         }];
    }
    else if (NSClassFromString(@"TWTweetComposeViewController") && [TWTweetComposeViewController canSendTweet]) // Runing on iOS 5
    {
        [account requestAccessToAccountsWithType:twitterAccountType withCompletionHandler:^(BOOL granted, NSError *error)
         {
             if (granted)
             {
                 TWRequest *request = [[TWRequest alloc] initWithURL:url parameters:params requestMethod:TWRequestMethodGET];
                 [request setAccount:[twitterAccounts lastObject]];

                 dispatch_async(dispatch_get_main_queue(), ^
                                {
                                    [NSURLConnection sendAsynchronousRequest:request.signedURLRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response1, NSData *data, NSError *error)
                                     {
                                         dispatch_async(dispatch_get_main_queue(), ^
                                                        {                             
                                                            if (data)                                 
                                                            {                                 
                                                                NSString* newStr = [[NSString alloc] initWithData:data
                                                                                                         encoding:NSUTF8StringEncoding];


                                                                NSLog(@"data:%@",newStr);                                                           }
                                                        });
                                     }];


                                });
             }
         }];
    }
}
2
Shankar BS On

yes we can.

 ACAccountStore *account = [[ACAccountStore alloc] init];
 ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
NSString *message = _textView.text;
//hear before posting u can allow user to select the account
 NSArray *arrayOfAccons = [account accountsWithAccountType:accountType];
 for(ACAccount *acc in arrayOfAccons)
 {
    NSLog(@"%@",acc.username); 
    NSDictionary *properties = [acc dictionaryWithValuesForKeys:[NSArray arrayWithObject:@"properties"]];
    NSDictionary *details = [properties objectForKey:@"properties"];
    NSLog(@"user name = %@",[details objectForKey:@"fullName"]);//full name
    NSLog(@"user_id  =  %@",[details objectForKey:@"user_id"]);//user id 
 } 

for email id, we can also able to get user email id see the updated answer hear