Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.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
Php NSURLConnection sendSynchronousRequest需要在URL中进行身份验证_Php_Ios_Objective C_Http_Http Authentication - Fatal编程技术网

Php NSURLConnection sendSynchronousRequest需要在URL中进行身份验证

Php NSURLConnection sendSynchronousRequest需要在URL中进行身份验证,php,ios,objective-c,http,http-authentication,Php,Ios,Objective C,Http,Http Authentication,通过这个问题,我实现了将文件上载到服务器: 我正在阅读苹果的文档以了解NSURLConnection sendSynchronousRequest方法的安全性,文档中说,如果文件需要身份验证,它将在URL中使用凭据。我的问题是,如何要求身份验证?我假设它在服务器端。有大量不同类型的身份验证。有关更多信息,请参阅《URL加载系统编程指南》的一节 但是,在回答您的问题时,是的,您可能希望在web服务器上使用安全性,然后让您的iOS网络请求使用适当的凭据进行身份验证。如果您只是想了解身份验证请求的世界

通过这个问题,我实现了将文件上载到服务器:


我正在阅读苹果的文档以了解NSURLConnection sendSynchronousRequest方法的安全性,文档中说,如果文件需要身份验证,它将在URL中使用凭据。我的问题是,如何要求身份验证?我假设它在服务器端。

有大量不同类型的身份验证。有关更多信息,请参阅《URL加载系统编程指南》的一节

但是,在回答您的问题时,是的,您可能希望在web服务器上使用安全性,然后让您的iOS网络请求使用适当的凭据进行身份验证。如果您只是想了解身份验证请求的世界,那么您可能应该从HTTP“基本”身份验证开始。(还有许多其他类型的身份验证,但检查所有这些类型超出了简单堆栈溢出回答的范围。)

HTTP“基本”身份验证的实现由两个组件组成:

  • 在服务器上,您希望转到网站管理并向包含web服务的文件夹(例如,您与我们共享的链接中引用的PHP代码)添加用户ID和密码。具体细节会因您使用的web服务器而异。我的ISP提供一个“控制面板”,在“安全”部分有一个称为“目录密码”的功能。您的web服务器可能会有所不同,因此,如果不明显,请与您的ISP联系

  • 在iOS端,除了标准的
    didReceiveResponse
    didReceiveData
    ,您希望使用基于委托的
    NSURLConnection
    ,而不是
    sendSynchronousRequest
    (无论如何,这是一个可怕的解决方案;永远不要进行同步网络请求),
    connectiondFinishLoading
    didFailWithError
    方法,您还需要编写一个
    didReceiveAuthenticationChallenge
    方法,该方法提供您在上一步中设置的用户ID和密码

  • 在iOS端,您希望执行以下操作,而不是
    sendSynchronousRequest

    [NSURLConnection connectionWithRequest:request delegate:self];
    
    然后实现以下委托方法:

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
            int statusCode = [(NSHTTPURLResponse *)response statusCode];
            if (statusCode != 200) {
                NSLog(@"%s failed status code %d", __FUNCTION__, statusCode);
            }
        }
    
        self.responseData = [NSMutableData data];
    }
    
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        [self.responseData appendData:data];
    }
    
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        // do whatever you want upon success
    
        NSLog(@"%s success; data = %@", __FUNCTION__, [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding]);
    }
    
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
        // do whatever you want upon failure
    
        NSLog(@"%s: %@", __FUNCTION__, error);
    }
    
    -(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
    {
        if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic]) {
            if ([challenge previousFailureCount] == 0) {
                NSURLCredential *credential = [NSURLCredential credentialWithUser:kUsername
                                                                         password:kPassword
                                                                      persistence:NSURLCredentialPersistenceForSession];
    
                [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
            }
            else
            {
                [[challenge sender] cancelAuthenticationChallenge:challenge];
    
                // inform the user that the user name and password
                // in the preferences are incorrect
    
                NSLog (@"failed authentication");
    
                // ...error will be handled by connection didFailWithError
            }
        }
    }
    
    显然,这假设您已经定义了
    responseData
    属性:

    @property (nonatomic, strong) NSMutableData *responseData;
    

    现在,我怀疑您对所有这些代码发送请求并验证该请求的概念感到愤怒。但是,执行正确的HTTP级别身份验证需要这样的解决方案。像
    sendSynchronousRequest
    (无论如何,您应该避免)和
    sendSynchronousRequest
    (更好,但仍然不能处理像这样的身份验证挑战)这样的方便方法不能胜任这项任务。如果你不想写所有的代码,那么你可以考虑使用这样的一个库来完成所有这些代码(加上更多的代码),让你摆脱这种网络请求的杂草。嗯,有点不太可能。我之所以实现这一点,是因为我最初尝试进行SFTP上传(这件事的全部目的是上传一个文件),但我找不到如何实现这样一个库。你有什么有用的资源吗?教程将非常有用。@benjsigmon从你在问题中引用的另一个答案可以推断,人们通常使用HTTP上传文件(坦白地说,我假设在你引用这个答案时,你说你将使用HTTPS而不是SFTP)。这比SFTP更常见(更简单,IMHO)。如果您必须使用SFTP,那么这个答案可能会有所帮助:。或者谷歌“iOS sftp库”。事实上,我不知道。在我所有的应用程序开发中,我从未处理过足够敏感的数据,除了电子邮件以外,我还需要其他任何东西。无论如何,谢谢你的帮助。我在应用程序中需要的这个小功能占用了我大部分的时间。帕累托原理等等。