我正在尝试制作一个从在线服务器下载pdf文件的应用。 我做的是创建了3个按钮,它们有3个不同的URL并将其保存到应用程序的沙箱中并在iBooks中打开。
但它崩溃了应用程序,我有这个错误说...
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter' ***
这是我的代码: 按钮单击:
if (sender.tag == 1) {
pdfTag = 1;
pdfSource1 = @"http://myweb.com/folder/folderagain/file1.pdf";
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:pdfSource1]];
NSURLConnection *conn = [[NSURLConnection alloc] init];
(void)[conn initWithRequest:request delegate:self];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
dataSource1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:pdfSource1]];
dispatch_sync(dispatch_get_main_queue(), ^{
});
pdfSourcePath1 = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"myPDF1.pdf"];
NSLog(@"PDF path: %@",pdfSourcePath1);
[dataSource1 writeToFile:pdfSourcePath1 atomically:YES];
});
} else if (sender.tag == 2) {
pdfTag = 2;
pdfSource2 = @"http://myweb.com/folder/folderagain/file2.pdf";
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:pdfSource2]];
NSURLConnection *conn = [[NSURLConnection alloc] init];
(void)[conn initWithRequest:request delegate:self];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
dataSource2 = [NSData dataWithContentsOfURL:[NSURL URLWithString:pdfSource2]];
dispatch_sync(dispatch_get_main_queue(), ^{
});
pdfSourcePath2 = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"myPDF2.pdf"];
NSLog(@"PDF path: %@",pdfSourcePath2);
[dataSource2 writeToFile:pdfSourcePath2 atomically:YES];
});
} else if (sender.tag == 3) {
pdfTag = 3;
pdfSource3 = @"http://myweb.com/folder/folderagain/file3.pdf";
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:pdfSource3]];
NSURLConnection *conn = [[NSURLConnection alloc] init];
(void)[conn initWithRequest:request delegate:self];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
dataSource3 = [NSData dataWithContentsOfURL:[NSURL URLWithString:pdfSource3]];
dispatch_sync(dispatch_get_main_queue(), ^{
});
pdfSourcePath3 = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"myPDF3.pdf"];
NSLog(@"PDF path: %@",pdfSourcePath3);
[dataSource3 writeToFile:pdfSourcePath3 atomically:YES];
});
}
打开文件:
if (pdfTag == 1) {
NSURL *url = [NSURL fileURLWithPath:pdfSourcePath1];
docController1 = [UIDocumentInteractionController interactionControllerWithURL:url];
docController1.delegate = self;
[docController1 presentOpenInMenuFromRect:btn1.frame inView:self.view animated:YES];
} else if (pdfTag == 2) {
NSURL *url = [NSURL fileURLWithPath:pdfSourcePath2];
docController2 = [UIDocumentInteractionController interactionControllerWithURL:url];
docController2.delegate = self;
[docController2 presentOpenInMenuFromRect:btn2.frame inView:self.view animated:YES];
} else if (pdfTag == 3) {
NSURL *url = [NSURL fileURLWithPath:pdfSourcePath3];
docController2 = [UIDocumentInteractionController interactionControllerWithURL:url];
docController2.delegate = self;
[docController2 presentOpenInMenuFromRect:btn3.frame inView:self.view animated:YES];
}
我希望我能找到答案。
答案 0 :(得分:0)
在您的代码中,我无法看到您在任何地方使用过的API initFileURLWithPath
。
以下是我对你的任务的建议,
以下是使用服务器文件路径将远程Pdf作为NSData
获取并存储在应用程序沙箱中的代码。
NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:bookUrlString]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"myPDF.pdf"];
[pdfData writeToFile:filePath atomically:YES
根据我对此目的的理解,这不需要任何NSURLRequest
或NSURLConnection
......
答案 1 :(得分:0)
网络是一项复杂的任务,我绝不会建议您使用-initWithURL
方法下载或上传文件,因为它不是异步的,会阻塞主线程。你应该使用NSURLConnection
类及其委托方法,或者只接受队列和完成块的惊人的类方法。
你使用NSURLConnection做了很奇怪的事情,但你使用的是..WithURL方法你应该和他们一起去。
Web上有不同的下载管理器可以帮助您完成整个过程,因为它们包装了NSURLConnection类和委托方法。
有:
答案 2 :(得分:0)
NSData dataWithContentsOfURL
就可以正常工作。
我不建议您使用此方法下载大文件,而是使用NSURLConnection
或AFNetworking
。
以下答案解释了如何使用NSURLConnection
和AFNetworking
下载文件:
https://stackoverflow.com/a/16454923/2548707