Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 1109771
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 17, 20262026-05-17T02:17:22+00:00 2026-05-17T02:17:22+00:00

I am currently in the process of building a native Google Reader iPhone application

  • 0

I am currently in the process of building a native Google Reader iPhone application similar to the successful application “Reeder for iPhone”, however, with a full Twitter client inbuilt as well.

I have finished the Twitter client and am now struggling to start the Google Reader client. I’ve browsed through multiple documents and have taken a look at the gdata-objective-client samples, yet I still can’t seem to understand what I have to do to accomplish the same functionality as Reeder does.

Basically I want to be able to present the user with a login screen. The user then submits their credentials and the access token and all of that are done behind scenes, like they do with Twitter’s xAuth. I then want to push a view controller that shows a UITableView with all the current unread feeds. When the user clicks the UITableViewCell a detailed view is respectively pushed containing the posts content.

Is this possible and if so, how do I go about implementing these features? I would appreciate it if people posted “code snippets” and actually show how they achieve the implementations.

Thanks in advance!

EDIT: It has been brought to my attention that the google app engine isn’t needed. The question however, still remains the same. How would I implement Google Reader into my application?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-17T02:17:22+00:00Added an answer on May 17, 2026 at 2:17 am

    It was so simple. For all those wondering, to connect to Google Reader API, I did the following.

    /*  Google clientLogin API:
         Content-type: application/x-www-form-urlencoded
         Email=userName
         Passwd=password
         accountType=HOSTED_OR_GOOGLE
         service=xapi
         source = @"myComp-myApp-1.0"
         */
    
        //define our return objects
        BOOL authOK;
        NSString *authMessage = [[NSString alloc] init];
        NSArray *returnArray = nil;
        //begin NSURLConnection prep:
        NSMutableURLRequest *httpReq = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:GOOGLE_CLIENT_AUTH_URL] ];
        [httpReq setTimeoutInterval:30.0];
        //[httpReq setCachePolicy:NSURLRequestReloadIgnoringCacheData];
        [httpReq setHTTPMethod:@"POST"];
        //set headers
        [httpReq addValue:@"Content-Type" forHTTPHeaderField:@"application/x-www-form-urlencoded"];
        //set post body
        NSString *requestBody = [[NSString alloc] 
                                 initWithFormat:@"Email=%@&Passwd=%@&service=reader&accountType=HOSTED_OR_GOOGLE&source=%@",
                                 gUserString, gPassString, [NSString stringWithFormat:@"%@%d", gSourceString]];
    
        [httpReq setHTTPBody:[requestBody dataUsingEncoding:NSASCIIStringEncoding]];
    
        NSHTTPURLResponse *response = nil;
        NSError *error = nil;
        NSData *data = nil;
        NSString *responseStr = nil;
        NSArray *responseLines = nil;
        NSString *errorString;
        //NSDictionary *dict;
        int responseStatus = 0;
        //this should be quick, and to keep same workflow, we'll do this sync.
        //this should also get us by without messing with threads and run loops on Tiger.
        data = [NSURLConnection sendSynchronousRequest:httpReq returningResponse:&response error:&error];
    
        if ([data length] > 0) {
            responseStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
            //NSLog(@"Response From Google: %@", responseStr);
            responseStatus = [response statusCode];
            //dict = [[NSDictionary alloc] initWithDictionary:[response allHeaderFields]];
            //if we got 200 authentication was successful
            if (responseStatus == 200 ) {
                authOK = TRUE;
                authMessage = @"Successfully authenticated with Google. You can now start viewing your unread feeds.";
            }
            //403 = authentication failed.
            else if (responseStatus == 403) {
                authOK = FALSE;
                //get Error code.
                responseLines  = [responseStr componentsSeparatedByString:@"\n"];
                //find the line with the error string:
                int i;
                for (i =0; i < [responseLines count]; i++ ) {
                    if ([[responseLines objectAtIndex:i] rangeOfString:@"Error="].length != 0) {
                        errorString = [responseLines objectAtIndex:i] ;
                    }
                }
    
                errorString = [errorString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
                /*
                 Official Google clientLogin Error Codes:
                 Error Code Description
                 BadAuthentication  The login request used a username or password that is not recognized.
                 NotVerified    The account email address has not been verified. The user will need to access their Google account directly to resolve the issue before logging in using a non-Google application.
                 TermsNotAgreed The user has not agreed to terms. The user will need to access their Google account directly to resolve the issue before logging in using a non-Google application.
                 CaptchaRequired    A CAPTCHA is required. (A response with this error code will also contain an image URL and a CAPTCHA token.)
                 Unknown    The error is unknown or unspecified; the request contained invalid input or was malformed.
                 AccountDeleted The user account has been deleted.
                 AccountDisabled    The user account has been disabled.
                 ServiceDisabled    The user's access to the specified service has been disabled. (The user account may still be valid.)
                 ServiceUnavailable The service is not available; try again later.
                 */
    
                if ([errorString  rangeOfString:@"BadAuthentication" ].length != 0) {
                    authMessage = @"Please Check your Username and Password and try again.";
                }else if ([errorString  rangeOfString:@"NotVerified"].length != 0) {
                    authMessage = @"This account has not been verified. You will need to access your Google account directly to resolve this";
                }else if ([errorString  rangeOfString:@"TermsNotAgreed" ].length != 0) {
                    authMessage = @"You have not agreed to Google terms of use. You will need to access your Google account directly to resolve this";
                }else if ([errorString  rangeOfString:@"CaptchaRequired" ].length != 0) {
                    authMessage = @"Google is requiring a CAPTCHA response to continue. Please complete the CAPTCHA challenge in your browser, and try authenticating again";
                    //NSString *captchaURL = [responseStr substringFromIndex: [responseStr rangeOfString:@"CaptchaURL="].length]; 
                    //either open the standard URL in a browser, or show a custom sheet with the image and send it back...
                    //parse URL to append to GOOGLE_CAPTCHA_URL_PREFIX
                    //but for now... just launch the standard URL.
                    //[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:GOOGLE_CAPTCHA_STANDARD_UNLOCK_URL]];         
                }else if ([errorString  rangeOfString:@"Unknown" ].length != 0) {
                    authMessage = @"An Unknow error has occurred; the request contained invalid input or was malformed.";
                }else if ([errorString  rangeOfString:@"AccountDeleted" ].length != 0) {
                    authMessage = @"This user account previously has been deleted.";
                }else if ([errorString  rangeOfString:@"AccountDisabled" ].length != 0) {
                    authMessage = @"This user account has been disabled.";
                }else if ([errorString  rangeOfString:@"ServiceDisabled" ].length != 0) {
                    authMessage = @"Your access to the specified service has been disabled. Please try again later.";
                }else if ([errorString  rangeOfString:@"ServiceUnavailable" ].length != 0) {
                    authMessage = @"The service is not available; please try again later.";
                }
    
            }//end 403 if
    
        }
        //check most likely: no internet connection error:
        if (error != nil) {
            authOK = FALSE;
            if ( [error domain]  == NSURLErrorDomain) {
                authMessage = @"Could not reach Google.com. Please check your Internet Connection";
            }else {
                //other error
                authMessage = [authMessage stringByAppendingFormat:@"Internal Error. Please contact notoptimal.net for further assistance. Error: %@", [error localizedDescription] ];
            }
        }
        //NSLog (@"err localized description %@", [error localizedDescription]) ;
        //NSLog (@"err localized failure reasons %@", [error localizedFailureReason]) ;
        //NSLog(@"err code  %d", [error code]) ;
        //NSLog (@"err domain %@", [error domain]) ;
    
    
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Authentication" message:authMessage delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    
        [gUserString    release];
        [gPassString    release];
        [gSourceString  release];
    
        [authMessage    release];
    
    }
    
    }
    

    Obviously I used my own delegates and such, but that is the overall want/feel that I brought to my application.

    I’m currently working on pulling the unread feeds/items into a UITableView to display in my RootViewController. I’ll update this with more information.

    Thanks to all those that tried to help 😀

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I am building an application and currently am in the process of add backgrounds
My team is currently in the process of building an ASP.NET MVC application, and
I'm currently in the process of writing a steganography application with Qt. I am
I'm currently in the process of creating a Silverlight 3 data driven application. To
Currently I am building an application that launches crtmpd (a rtmp server written in
I'm currently in the process of building our ASP.NET C# 3.5 Web site and
I'm currently in the process of building a CRUD tool for an existing Spring-based
I'm currently in the process of building a small shell within C++. A user
I have an automated deployment process for a Java app where currently I'm building
I'm currently in the process of building a repository for a project that will

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.