Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iPhone应用程序中使用Google Reader API和OAuth_Iphone_Objective C_Oauth_Google Reader - Fatal编程技术网

在iPhone应用程序中使用Google Reader API和OAuth

在iPhone应用程序中使用Google Reader API和OAuth,iphone,objective-c,oauth,google-reader,Iphone,Objective C,Oauth,Google Reader,我想制作一个在谷歌阅读器API上使用的应用程序。但是我发现没有一个官方的API——在应用商店指南/批准方面,使用非官方的API有问题吗?其他应用程序(Reeder等)会使用此功能吗 另外,登录的最佳方法是什么?OAuth是首选方法吗?使用Janrain是个好主意吗?坦率地说,如果你使用谷歌的非官方API,苹果并不在乎 我在一个RSS阅读器应用程序上为一位客户工作,该应用程序使用谷歌阅读器进行同步。我们没有使用OAuth,而是使用标准HTTP登录,它返回一个cookie,您必须从中提取一个令牌,以

我想制作一个在谷歌阅读器API上使用的应用程序。但是我发现没有一个官方的API——在应用商店指南/批准方面,使用非官方的API有问题吗?其他应用程序(Reeder等)会使用此功能吗


另外,登录的最佳方法是什么?OAuth是首选方法吗?使用Janrain是个好主意吗?

坦率地说,如果你使用谷歌的非官方API,苹果并不在乎

我在一个RSS阅读器应用程序上为一位客户工作,该应用程序使用谷歌阅读器进行同步。我们没有使用OAuth,而是使用标准HTTP登录,它返回一个cookie,您必须从中提取一个令牌,以便在对各种阅读器URL的连续调用中使用

我可以从我的(旧的)概念验证应用程序向您发布登录代码。 它使用ASIHTTP和一些自定义字符串类别。其思想是发送登录请求,获取响应,并从响应的cookie头中提取会话ID/auth代码。然后,您可以将会话ID/auth代码用于连续调用

#pragma mark -
#pragma mark login

//this is your sessionID token you get from the login
//use this in consecutive calls to google reader
//this method returns you the header string you have to add to your request
//[request addRequestHeader: @"Cookie" value: [self sidHeader]];
- (NSString *) sidHeader
{
    return [NSString stringWithFormat: @"SID=%@", [self sid]];
}

- (NSString *) authHeader
{
    return [NSString stringWithFormat: @"GoogleLogin auth=%@",[self auth]];
}


//login to your google account and get the session ID
- (void) login
{
    NSString *username = @"my.googlelogin@gmail.com";
    NSString *password = @"mypassword123";
    NSString *loginUrl = @"https://www.google.com/accounts/ClientLogin?client=NNW-Mac";
    NSString *source = @"NNW-Mac"; //let's fake NetNewsWire
    NSString *continueUrl = @"http://www.google.com";

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString: loginUrl]]; // log in & get cookies
    [request addRequestHeader: @"User-Agent" value: @"NetNewsWire/3.2b25 (Mac OS X; http://www.newsgator.com/Individuals/NetNewsWire/)"];

    [request setPostValue: username forKey: @"Email"];
    [request setPostValue: password forKey: @"Passwd"];
    [request setPostValue: @"reader" forKey: @"service"];
    [request setPostValue: source forKey: @"source"];
    [request setPostValue: continueUrl forKey: @"continue"];

    [request setDelegate: self];
    [request setDidFailSelector: @selector(loginRequestFailed:)];
    [request setDidFinishSelector: @selector(loginRequestFinished:)];

    [request start];
}   

-(void)loginRequestFinished:(ASIHTTPRequest *)request
{
    NSString *responseString = [request responseString];

    //login failed
    if ([responseString containsString: @"Error=BadAuthentication" ignoringCase: YES])
    {
        [self setLastError: [self errorWithDescription: @"Bad Username/Passsword" code: 0x001 andErrorLevel: 0x00]];

        if ([delegate respondsToSelector: @selector(gReaderLoginDidFail:)])
        {
            [delegate gReaderLoginDidFail: self];
        }

        return NO;
    }

    //captcha required
    if ([responseString containsString: @"CaptchaRequired" ignoringCase: YES])
    {
        [self setLastError: [self errorWithDescription: @"Captcha Required" code: 0x001 andErrorLevel: 0x00]];

        if ([delegate respondsToSelector: @selector(gReaderLoginDidFail:)])
        {
            [delegate gReaderLoginDidFail: self];
        }

        return NO;
    }

    //extract SID + auth
    NSArray *respArray = [responseString componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]];

    NSString *sidString = [respArray objectAtIndex: 0];
    sidString = [sidString stringByReplacingOccurrencesOfString: @"SID=" withString: @""];
    [self setSid: sidString];

NSString *authString = [respArray objectAtIndex: 2];
authString = [authString stringByReplacingOccurrencesOfString: @"Auth=" withString: @""];
[self setAuth: authString];
    //mesage delegate of success
    if ([delegate respondsToSelector: @selector(gReaderLoginDidSucceed:)])
    {
        [delegate gReaderLoginDidSucceed: self];
    }

    return YES;
}

- (void)loginRequestFailed:(ASIHTTPRequest *)request
{
    NSError *error = [request error];

    //NSLog(@"login request failed with error: %@", [error localizedDescription]);
    [self setLastError: error];

    if ([delegate respondsToSelector: @selector(gReaderLoginDidFail:)])
    {
        [delegate gReaderLoginDidFail: self];
    }

}
登录后,您可以使用sid和auth伪造对读取器API端点的请求

例如:

- (ASIHTTPRequest *) requestForAPIEndpoint: (NSString *) apiEndpoint
{
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString: apiEndpoint]];
    [request addRequestHeader: @"User-Agent" value: @"NetNewsWire/3.2b25 (Mac OS X; http://www.newsgator.com/Individuals/NetNewsWire/)"];
    [request addRequestHeader: @"Cookie" value: [self sidHeader]];
    [request addRequestHeader: @"Authorization" value: [self authHeader]];

    return request;
}
关于GoogleReader及其私有API的有趣读物是

请务必阅读最新评论:)

/编辑:我更新了代码以使用auth头(谷歌在今年6月引入了auth头)。我想如果您想使用OAuth,这里应该是放置OAuth令牌的地方。guess

Ive发现了这一点:“Google Data API Objective-C客户端库提供了一个iPhone静态库、一个Mac OS X框架和源代码,使得通过Google Data API轻松访问数据。”-这太棒了! 但是,它不包括ReaderAPI(因为它尚未发布)

我已经能够通过更改访问API(在OAuthSampleTouch示例中)

在OAuthSampleRootViewControllerTouch.m中

NSString *scope = @"http://www.google.com/reader/api/*";

如果设计是一个文件夹名称-检查这是一个很大的帮助


更新

我发现这种技术是最好的/最轻的/不太复杂的:

谢谢你的Jaroslaw!我担心在应用程序中使用非官方API。我应该吗?是和否:)不,因为苹果不在乎你是否使用其他人的非官方API(他们只关心自己的API)。因此,如果您尝试将Google Reader应用程序放入应用商店,您将不会从苹果那里得到任何麻烦。\n\n但非官方API通常存在问题,因为它们随时都可能更改。例如:我首先发布的示例代码被破坏了,我不得不修复它,因为Google决定对Auth使用新的“Auth”参数,而忽略SID。支持一个非官方的第三方API总是可行的,你应该意识到这一点。但你认为像Reedera这样的应用程序都有同样的问题吗?我不介意所有其他阅读器应用程序同时失败:)嘿,苹果可以接受ASIFormDataRequest和其他库文件吗?我被他们的政策弄糊涂了。我听说他们拒绝使用外部库的应用程序。这不是他们中的一个吗?哪里可以找到“来源”。我需要在谷歌的网站上注册我的应用程序吗?
NSString *scope = @"http://www.google.com/reader/api/*";
urlStr = @"http://www.google.com/m8/feeds/contacts/default/thin";
urlStr = @"http://www.google.com/reader/atom/user/-/label/Design";