Добавление примера кода к этому вопросу, потому что кто-то связался со мной напрямую по поводу моего решения. Обратите внимание, что вы должны установить параметр «service» равным «ah» в начальном запросе токена.
Первоначальный запрос токена [выполнено синхронно] ПРИМЕЧАНИЕ. Для параметра «service» установлено значение «ah», а для «source» просто установлено значение «myapp», вам следует использовать имя вашего приложения.
//create request
NSString* content = [NSString stringWithFormat:@"accountType=HOSTED_OR_GOOGLE&Email=%@&Passwd=%@&service=ah&source=myapp", [loginView username].text, [loginView password].text];
NSURL* authUrl = [NSURL URLWithString:@"https://www.google.com/accounts/ClientLogin"];
NSMutableURLRequest* authRequest = [[NSMutableURLRequest alloc] initWithURL:authUrl];
[authRequest setHTTPMethod:@"POST"];
[authRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];
[authRequest setHTTPBody:[content dataUsingEncoding:NSASCIIStringEncoding]];
NSHTTPURLResponse* authResponse;
NSError* authError;
NSData * authData = [NSURLConnection sendSynchronousRequest:authRequest returningResponse:&authResponse error:&authError];
NSString *authResponseBody = [[NSString alloc] initWithData:authData encoding:NSASCIIStringEncoding];
//loop through response body which is key=value pairs, seperated by \n. The code below is not optimal and certainly error prone.
NSArray *lines = [authResponseBody componentsSeparatedByString:@"\n"];
NSMutableDictionary* token = [NSMutableDictionary dictionary];
for (NSString* s in lines) {
NSArray* kvpair = [s componentsSeparatedByString:@"="];
if ([kvpair count]>1)
[token setObject:[kvpair objectAtIndex:1] forKey:[kvpair objectAtIndex:0]];
}
//if google returned an error in the body [google returns Error=Bad Authentication in the body. which is weird, not sure if they use status codes]
if ([token objectForKey:@"Error"]) {
//handle error
};
Следующим шагом будет запуск вашего приложения на движке приложений Google, который предоставит вам файл cookie ASCID. Я не уверен, почему существует этот дополнительный шаг, похоже, это проблема на стороне Google и, возможно, почему GAE в настоящее время нет в их списке obj-c Google Data API API. Мои тесты показывают, что у меня есть , чтобы запросить cookie для синхронизации с GAE. Кроме того, обратите внимание, что я ничего не делаю с cookie. Кажется, что, просто запросив его и получив готовый файл, будущие запросы будут автоматически содержать cookie. Я не уверен, что это приложение для iPhone, потому что мое приложение - приложение для iPhone, но я не до конца понимаю, что происходит с этим файлом cookie. ПРИМЕЧАНИЕ: использование «myapp.appspot.com».
NSURL* cookieUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://myapp.appspot.com/_ah/login?continue=http://myapp.appspot.com/&auth=%@", [token objectForKey:@"Auth"]]];
NSLog([cookieUrl description]);
NSHTTPURLResponse* cookieResponse;
NSError* cookieError;
NSMutableURLRequest *cookieRequest = [[NSMutableURLRequest alloc] initWithURL:cookieUrl];
[cookieRequest setHTTPMethod:@"GET"];
NSData* cookieData = [NSURLConnection sendSynchronousRequest:cookieRequest returningResponse:&cookieResponse error:&cookieError];
Наконец, я могу опубликовать JSON в моем приложении Gae. ПРИМЕЧАНИЕ: приведенный ниже фрагмент является асинхронным запросом. Мы можем обработать ответы, реализовав didReceiveResponse, didReceiveData, didFailWIthError.
NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://myapp.appspot.com/addRun?auth=%@", mytoken]];
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:@"my http body";
NSURLConnection *connectionResponse = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (!connectionResponse) {
NSLog(@"Failed to submit request");
} else {
NSLog(@"Request submitted");
}