Sample code for 30+ languages & platforms
Objective-C

Page Through All Contacts

See more Google APIs Examples

Demonstrates how to page through the entire list of Google Contacts.

Chilkat Objective-C Downloads

Objective-C
#import <CkoJsonObject.h>
#import <CkoAuthGoogle.h>
#import <CkoRest.h>
#import <CkoStringBuilder.h>
#import <CkoXml.h>
#import <NSString.h>

BOOL success = NO;

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

// --------------------------------------------------------------------------------------------------------
// Note: The code for setting up the Chilkat REST object and making the initial connection can be done once.
// Once connected, the REST object may be re-used for many REST API calls.
// (It's a good idea to put the connection setup code in a separate function/subroutine.)
// --------------------------------------------------------------------------------------------------------

// It is assumed we previously obtained an OAuth2 access token.
// This example loads the JSON access token file 
// saved by this example: Get Google Contacts OAuth2 Access Token

CkoJsonObject *jsonToken = [[CkoJsonObject alloc] init];
success = [jsonToken LoadFile: @"qa_data/tokens/googleContacts.json"];
if (success != YES) {
    NSLog(@"%@",@"Failed to load googleContacts.json");
    return;
}

CkoAuthGoogle *gAuth = [[CkoAuthGoogle alloc] init];
gAuth.AccessToken = [jsonToken StringOf: @"access_token"];

CkoRest *rest = [[CkoRest alloc] init];

// Connect using TLS.
BOOL bAutoReconnect = YES;
success = [rest Connect: @"www.google.com" port: [NSNumber numberWithInt: 443] tls: YES autoReconnect: bAutoReconnect];

// Provide the authentication credentials (i.e. the access token)
[rest SetAuthGoogle: gAuth];

// ----------------------------------------------
// OK, the REST connection setup is completed..
// ----------------------------------------------

int startIndex = 1;
int maxResults = 25;
// The totalResults will get updated with the correct value in the 1st loop iteration..
int totalResults = 100;
// To retrieve the contacts in pages of 25 each, we need to send the following for each page.

// 	GET /m8/feeds/contacts/default/full?max-results=25&start-index=<startIndex>
// 	GData-Version: 3.0

CkoStringBuilder *sbMaxResults = [[CkoStringBuilder alloc] init];
[sbMaxResults AppendInt: [NSNumber numberWithInt: maxResults]];
CkoStringBuilder *sbStartIndex = [[CkoStringBuilder alloc] init];

int loopIteration = 0;
while (startIndex <= totalResults) {

    [sbStartIndex Clear];
    [sbStartIndex AppendInt: [NSNumber numberWithInt: startIndex]];

    [rest ClearAllHeaders];
    [rest ClearAllQueryParams];
    [rest AddHeader: @"GData-Version" value: @"3.0"];
    [rest AddQueryParam: @"start-index" value: [sbStartIndex GetAsString]];
    [rest AddQueryParam: @"max-results" value: [sbMaxResults GetAsString]];

    CkoStringBuilder *sbResponseBody = [[CkoStringBuilder alloc] init];
    success = [rest FullRequestNoBodySb: @"GET" uriPath: @"/m8/feeds/contacts/default/full" sb: sbResponseBody];
    if (success != YES) {
        NSLog(@"%@",rest.LastErrorText);
        return;
    }

    // A successful response will have a status code equal to 200.
    if ([rest.ResponseStatusCode intValue] != 200) {
        NSLog(@"%@%d",@"response status code = ",[rest.ResponseStatusCode intValue]);
        NSLog(@"%@%@",@"response status text = ",rest.ResponseStatusText);
        NSLog(@"%@%@",@"response header: ",rest.ResponseHeader);
        NSLog(@"%@%@",@"response body: ",[sbResponseBody GetAsString]);
        return;
    }

    // If the 200 response was received, then the contacts XML is contained
    // in the response body.
    CkoXml *xml = [[CkoXml alloc] init];
    [xml LoadSb: sbResponseBody autoTrim: NO];

    // Now let's parse the XML...

    // Get the the total number of results, the start index, and the items per page.
    // We'll likely NOT get the full list, but will instead get the 1st page.
    totalResults = [[xml GetChildIntValue: @"openSearch:totalResults"] intValue];
    int startIndex2 = [[xml GetChildIntValue: @"openSearch:startIndex"] intValue];
    int itemsPerPage = [[xml GetChildIntValue: @"openSearch:itemsPerPage"] intValue];
    NSLog(@"%@%d",@"totalResults = ",totalResults);
    NSLog(@"%@%d",@"startIndex = ",startIndex2);
    NSLog(@"%@%d",@"itemsPerPage = ",itemsPerPage);

    // Iterate over each contact.
    int numEntries = [[xml NumChildrenHavingTag: @"entry"] intValue];
    int i = 0;
    while (i < numEntries) {
        xml.I = [NSNumber numberWithInt: i];
        NSLog(@"%d%@",loopIteration * maxResults + i + 1,@" ----");
        NSLog(@"%@%@",@"title: ",[xml GetChildContent: @"entry[i]|title"]);

        NSString *idUrl = [xml GetChildContent: @"entry[i]|id"];
        NSLog(@"%@%@",@"id: ",idUrl);

        NSString *fullName = [xml ChilkatPath: @"entry[i]|gd:name|gd:fullName|*"];
        if (xml.LastMethodSuccess == YES) {
            NSLog(@"%@%@",@"fullName: ",fullName);
        }

        NSString *emailAddress = [xml ChilkatPath: @"entry[i]|gd:email|(address)"];
        if (xml.LastMethodSuccess == YES) {
            NSLog(@"%@%@",@"email address: ",emailAddress);
        }

        // Find the photo link and check to see if this contact has a photo.
        CkoXml *xLink = [xml GetChildWithAttr: @"link" attrName: @"rel" attrValue: @"http://schemas.google.com/contacts/2008/rel#photo"];
        if (xml.LastMethodSuccess == YES) {
            // Get the photo etag.
            BOOL bHasPhoto = [xLink HasAttribute: @"gd:etag"];
            if (bHasPhoto == YES) {
                NSLog(@"%@",@"This contact has a photo.");
            }

        }

        i = i + 1;
    }

    startIndex = startIndex + maxResults;
    loopIteration = loopIteration + 1;
}