gpt4 book ai didi

objective-c - native Google 阅读器 iPhone 应用程序

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:43 24 4
gpt4 key购买 nike

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

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

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

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

提前致谢!

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

最佳答案

原来如此简单。对于所有想知道的人,为了连接到 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];

}

}

显然,我使用了自己的委托(delegate)等,但这是我对应用程序的总体需求/感觉。

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

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

关于objective-c - native Google 阅读器 iPhone 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3802008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com