iPhone:是否可以使用openURL打开受密码保护的文件?

时间:2010-02-22 17:45:57

标签: iphone passwords openurl

标题几乎说明了一切。我的应用程序包含文件myFile.ext的URL和密码,位于:

https://myserver.com/stuff.cgi?db=mydb

我想创建一个NSURL对象,如果传递给UIApplication的canOpenURL和openURL方法,将导致适当的行为。

这可能吗?如果是这样的话?我应该注意安全问题吗?

编辑澄清:

以下代码生成一个URL请求,该请求在发送到服务器时成功导致应用程序下载该文件。但我想做的是用openURL打开它。

+ (NSMutableURLRequest *) requestForFileNamed: (NSString *) filename {
    NSString *url = [NSString stringWithFormat:@"%@&user=%@&getbinfile=%@", serverLocation, username, filename];
    NSString *body = [NSString stringWithFormat:@"password=%@", password];
    return [XMLRequestBuilder postRequestWithURL:url body:body];
}

XMLRequestBuilder方法:

+ (NSMutableURLRequest *) requestWithURL: (NSString *) url body: (NSString *) body method: (NSString *) method {
    NSURL * theURL = [NSURL URLWithString:url];
    NSMutableURLRequest * ret = [NSMutableURLRequest requestWithURL:theURL];
    [ret setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
    [ret setHTTPMethod: method];
    [ret setTimeoutInterval:kDefaultTimeoutInterval];
    return ret;
}


+ (NSMutableURLRequest *) postRequestWithURL: (NSString *) url body: (NSString *) body {
    return [XMLRequestBuilder requestWithURL:url body:body method:@"POST"];
}

1 个答案:

答案 0 :(得分:1)

假设(正如@bodnarbm指出的那样)你想要HTTP身份验证,那么它是相当直接的。只需实现didReceiveAuthenticationChallenge。以下是Apple的文档样本:

只需将[self preferencesName]和[self preferencesPassword]更改为您的用户名/密码。

-(void)connection:(NSURLConnection *)connection
        didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge previousFailureCount] == 0) {
        NSURLCredential *newCredential;
        newCredential=[NSURLCredential credentialWithUser:[self preferencesName]
                                                 password:[self preferencesPassword]
                                              persistence:NSURLCredentialPersistenceNone];
        [[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
        [self showPreferencesCredentialsAreIncorrectPanel:self];
    }
}

这是链接:http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

更新: 从上面的评论来看,它看起来并不像您使用的是HTTP身份验证(因此我的上述代码不适用于您,但我会将其留给可能帮助其他人)。

回到您的问题:您是否在请求中将HTTP方法标头值设置为“POST”?你为什么试图在体内发送pwd(如POST应该)但其他参数在URL中(作为GET)?将其他参数移动到POST请求的主体。如果您发布代码,可能更容易看到您出错的地方。