2016-05-06 2 views
1

Это локон команды я использую, чтобы загрузить PDF и это работает прекрасно:NSURLSession выполнить задачу загрузки, как «завиток»

curl -u USERNAME:PASSWORD -T MyPDF.pdf —url https://mywebserver.com 

Я использую NSURLSession и загрузить задачу с делегатами, но мой PDF никогда не загружен.

Вот мой код:

- (IBAction)upload:(id)sender { 
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:@"https://mywebserver.com/"]]; 
    [request setHTTPMethod:@"POST"]; 

    NSString* pdfPath = [[NSBundle mainBundle] pathForResource:@"bill" ofType:@"pdf"]; 
    NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:[NSURL fileURLWithPath:pdfPath]]; 

    [uploadTask resume]; 
} 

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { 

} 

- (void)URLSession:(NSURLSession *)session task:(nonnull NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error { 
    if (error) { 
     NSLog(@"Error = %@", error); 
    } 
} 

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(nonnull NSURLAuthenticationChallenge *)challenge completionHandler:(nonnull void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler { 
    completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession]); 
} 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask 
didReceiveResponse:(NSURLResponse *)response 
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { 
    completionHandler(NSURLSessionResponseAllow); 
} 

- (void)URLSession:(NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveData:(nonnull NSData *)data { 
    if (data) { 
     NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
    } 

} 

- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullable NSError *)error { 
    if (error) { 
     NSLog(@"Error = %@", error); 
    } 
} 
+0

Все ли делегаты называются? – Siriss

+0

Да. didReceiveData: метод возвращает мне код javascript и выглядит как код для окна входа в систему. Но команда curl работает, и я не уверен, чего не хватает в моем коде для использования учетных данных. – AceOfTheBase

+1

У меня нет ничего конкретного, чтобы предположить, как «завиток» может фактически обрабатывать учетные данные (справочная страница не соответствует специфике), но я ** предлагаю вам использовать такой инструмент, как Charles или WireShark, чтобы наблюдайте, как пакеты отправляются с вашего компьютера на ваш сервер с помощью команды 'curl', которая работает для вас; Я подозреваю, что есть или несколько круговых поездок, которые происходят, например, Проверка подлинности Kerberos, или если по какой-то магии все это обрабатывается в одном кругосветном путешествии, вероятно, он похоронен в заголовках. – fullofsquirrels

ответ

0

, что происходит, если вы пытаетесь использовать блок завершения с NSURLSessionAuthChallengeUseCredential

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(nonnull NSURLAuthenticationChallenge *)challenge completionHandler:(nonnull void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler { 
    completionHandler(NSURLSessionAuthChallengeUseCredential, 
    [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession]); 
} 

в целом убедитесь, что ваша загрузка работает на незащищенный сервер первым. чем тест с учетными данными.

Смежные вопросы