本机 Google Reader iPhone 应用程序

发布于 2024-09-25 01:08:17 字数 533 浏览 8 评论 0原文

我目前正在构建一个本机 Google Reader iPhone 应用程序,类似于成功的应用程序“Reeder for iPhone”,但也内置了完整的 Twitter 客户端。

我已经完成了 Twitter 客户端,现在正在努力启动 Google Reader 客户端。我浏览了多个文档并查看了 gdata-objective-client 示例,但我似乎仍然无法理解我必须做什么才能完成与 Reeder 相同的功能。

基本上我希望能够向用户展示登录屏幕。然后,用户提交他们的凭据和访问令牌,所有这些都是在幕后完成的,就像使用 Twitter 的 xAuth 一样。然后我想推送一个视图控制器,显示一个包含所有当前未读提要的 UITableView。当用户单击 UITableViewCell 时,将分别推送包含帖子内容的详细视图。

这可能吗?如果可以,我该如何实现这些功能?如果人们发布“代码片段”并实际展示他们如何实现实现,我将不胜感激。

提前致谢!

编辑:我注意到不需要谷歌应用程序引擎。然而问题仍然是一样的。如何在我的应用程序中实施 Google Reader?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

删除会话 2024-10-02 01:08:17

就是这么简单。对于所有想知道连接到 Google Reader API 的人,我执行了以下操作。

/*  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];

}

}

显然,我使用了自己的代表等,但这就是我给我的应用程序带来的总体想要/感觉。

我目前正在努力将未读的提要/项目拉入 UITableView 中以显示在我的 RootViewController 中。我将用更多信息更新此内容。

感谢所有试图提供帮助的人:D

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 :D

爱的故事 2024-10-02 01:08:17

谢谢。我知道有一种简单的登录方法,但我花了很长时间才弄清楚。顺便说一句,对于那些复制/传递上面 the0rkus 代码的人来说 - 你会得到一些错误。为了测试它,我添加了:

NSString *gUserString = @"[email protected]";
NSString *gPassString = @"yourpassword";
NSString *GOOGLE_CLIENT_AUTH_URL = @"https://www.google.com/accounts/ClientLogin?client=YourClient";
NSString *gSourceString = @"YourClient";

THANK YOU. I knew there was a simple way to log in, but I was having a horrible time figuring it out. Btw for those of you who are copying/pasing the the0rkus's code above - you'll get a few errors. To test it out I added:

NSString *gUserString = @"[email protected]";
NSString *gPassString = @"yourpassword";
NSString *GOOGLE_CLIENT_AUTH_URL = @"https://www.google.com/accounts/ClientLogin?client=YourClient";
NSString *gSourceString = @"YourClient";
心房的律动 2024-10-02 01:08:17

Google 一下,有很多博客介绍如何使用 Google Reader API。这是一个不错的起点:
http://mindsharestrategy.com/google-reader-api-a-brief-教程/

Google it, there are lots of blogs out there that describe how to use the Google Reader API. Here's a decent starting point:
http://mindsharestrategy.com/google-reader-api-a-brief-tutorial/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文