Twitter Integration

Episode #56 | 16 minutes | published on March 7, 2013
Subscribers Only
In this episode we implement the Social framework in order to integrate with Twitter. Using the provided framework, we issue an authenticated API call to get a list of Twitter followers for a given account, as well as compose a tweet with the new SLComposeViewController.

Episode Links

Maintaining a reference to the AccountStore

The account store is used to gain access to Twitter accounts that are saved on the device. Initially it will prompt the user for access and after it is granted, you can pull the accounts out of the store.

Creating the store is easy:

self.accountsStore = [[ACAccountStore alloc] init];

You also, however, have to release & rebuild this object if the account store changes. To do that, listen for the ACAccountStoreDidChange notification and rebuild it.

Requesting access to Twitter accounts

    ACAccountType *twitterAccountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
    [self.accountStore requestAccessToAccountsWithType:twitterAccountType
                                            completion:^(BOOL granted, NSError *error) {
                                                if (granted) {
                                                    ACAccount *account = [[self.accountStore accountsWithAccountType:twitterAccountType] lastObject];
                                                    [self fetchTwitterFollowersForAccount:account];
                                                } else {
                                                    NSLog(@"No permission :(  %@", error);

Fetching Twitter followers for an account

Once we have an account, we can make authenticated requests to the twitter API using SLRequest. The details of what we can do are documented on Twitter's API Docs.

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    NSURL *url = URLIFY(@"");
    id params = @{@"skip_status" : @"1", @"screen_name":@"nsscreencast", @"count": @"100"};
    SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter
    request.account = twitterAccount;
    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        if (responseData) {
            if (urlResponse.statusCode >= 200 && urlResponse.statusCode < 300) {
                NSError *jsonError = nil;
                NSDictionary *followerData = [NSJSONSerialization JSONObjectWithData:responseData
                if (followerData) {
                    NSLog(@"Response: %@", followerData);
                    self.followerDictionary = followerData;
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self.tableView reloadData];
                } else {
                    NSLog(@"JSON Parsing error: %@", jsonError);
            } else {
                NSLog(@"Server returned HTTP %d", urlResponse.statusCode);
        } else {
            NSLog(@"Something went wrong: %@", [error localizedDescription]);

        dispatch_async(dispatch_get_main_queue(), ^{
            [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

Composing a Tweet using SLComposeViewController

    NSString *tweetText = @"I'm tweeting from iOS 6 😏";
    SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    [tweetSheet setInitialText:tweetText];
    [self presentViewController:tweetSheet
blog comments powered by Disqus