我怎样才能解决这个NSURLConnection错误?

时间:2011-02-14 18:18:13

标签: iphone objective-c ios4 nsurlconnection

我目前正在构建一个iOS应用程序,它使用Kosmaczewski的Objective-C REST客户端/包装器连接到公共API。

此公共API使用基于HTTPS的基本身份验证。

我遇到的问题是,当我尝试使用包装器的界面提供用户名/密码时,它会崩溃。在做了一些搜索后,我认为这与这两个线程中讨论的错误有关:

目前,为了继续开发,我在网址中提供了用户名/密码,格式为:https://admin:pass@site.com

我真的需要找到一个解决方案才能正确地做到这一点。我不喜欢通过生成base64编码的字符串并修改身份验证标头来破解它的想法。我也不想使用ASIHTTPRequest这样的包装器(这很容易实现)。

所以我的问题是:这真的是一个错误吗?对于正在发生的事情还有另一种解释吗?你会建议尝试哪些技巧来解决它?

如果您想查看任何代码,请参阅包装器,因为我只是实现它。 https://github.com/akosma/iphonerestwrapper

非常感谢!

1 个答案:

答案 0 :(得分:1)

虽然你不想离开包装类,但听起来这是包装类中的一个错误。 NSUrlConnection如果单独使用则没有此问题,并且它也非常容易实现。下面是一些使用HTTP身份验证的REST服务的示例代码,如果您选择使用该路由。非常简单


-(void)makeConnection{

    NSURL *statusURL = [[NSURL alloc] initWithString:@"URLHERE"];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:statusURL];
    //change this to GET/PUT/POST/whatever you need
    [request setHTTPMethod:@"PUT"];

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    [statusURL release];
    [request release];

    [conn start];

    [conn release];

    responseData = [[NSMutableData alloc] init];
}

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge previousFailureCount] == 0) 
    {
        NSLog(@"Sending credentials");

        NSURLCredential *newCredential;
        newCredential = [NSURLCredential credentialWithUser:@"USERNAME" password:@"PASSWORD" persistence:NSURLCredentialPersistencePermanent];
        [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
    }
    else
    {
        [[challenge sender] cancelAuthenticationChallenge:challenge];

        // inform the user that the user name and password
        // in the preferences are incorrect
        NSLog(@"credentials are no good :(");
    }   
}

我会避免使用包装器,因为URL加载系统本身非常强大,引入更多复杂性总会引入更多错误:)

了解更多信息:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html