Objective-C dataWithContentsOfURL返回nill

我在这里有这个代码:

NSString *stringURL = @"\\\\SERVER\\FOLDER\\FOLDER\\FTP\\ANC\\ANC.pdf"; NSURL *url = [NSURL fileURLWithPath:stringURL]; NSData *urlData = [NSData dataWithContentsOfURL:url]; 

但urlData返回nill

我已经尝试datawithcontentsoffile数据,但使用urlvariables时,我得到了一个警告。

当我得到这个URL文件://SERVER/FOLDER/FOLDER/FTP/ANC.pdf在Windows中,它打开文件,但在Mac它不会。

我也尝试了以下几点:

 NSString *stringURL = @"file://SERVER/FOLDER/FOLDER/FTP/ANC.pdf"; NSURLSession *session = [NSURLSession sharedSession]; [[session dataTaskWithURL:[NSURL URLWithString:stringURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // handle response }] resume]; // NSURL *url = [NSURL URLWithString:stringURL]; // NSData *urlData = [NSData dataWithContentsOfURL:url]; 

但得到这些错误:

 NSErrorFallingURLStringKey NSErrorFallingURLKey NSLocalizedDescription NSUnderlyingError 

更新我能够得到url不会返回nill与以下内容:

 NSURL *url = [NSURL fileURLWithPath:@"file:///server/FOLDER/FOLDER/FTP/ANC/ANC.pdf"]; 

然而,这返回nill:

 NSData *urlData = [NSData dataWithContentsOfURL:url]; 

我添加了错误:dataWithContentsofURL

它返回这个:

 connectionError NSError * domain: @"NSCocoaErrorDomain" - code: 260 0x166d8af0 

我通过Get Info查看了有问题的文件,它开始像这样smb://server/folder/folder/ANC/ANC.pdf

NSData和URLs:有龙

+[NSData dataWithContentsOfURL:]可以由于许多原因返回nil 。 如果尝试使用该URL时出现任何错误,此方法将返回nil 。 例如,文件可能不存在,networking连接可能会超时,或者URL甚至可能不正确。 nil返回,应用程序不知道为什么。

+ [NSData dataWithContentsOfURL:options:error:]另一方面, 告诉调用者出了什么问题。 当返回nilerror参数将填充一个描述发生问题的对象。 使用这种方法将直接回答“为什么”的问题。

这两种方法都是同步方法,并且它们用于处理文件,networking资源,特别是从networking资源提供的文件的使用是不鼓励的。 这些方法将阻止调用者,并不是真正用于这种用途。 最好使用inputstream或NSURLSession代替。

SMB不支持

从你的问题,虽然你似乎试图访问SMB共享上存在的文件。 不幸的是,iOS不支持SMB – 即使你有一个格式正确的smb URL(即smb://servername/sharename/filename.pdf),你也将无法使用第三方SMB实现来访问它。

但是,使用FTP代替SMB,应该可以工作。

只需要做一些小的改变,其实你的pdf文件是在服务器上,所以你必须这样改变你的代码。

 NSURL *url = [NSURL URLWithString:stringURL]; 

我试过这个,工作正常。

如果您的文件位于应用程序的主包中,则可以使用fileURLWithPath

如果您的反斜杠分隔符有一个有效的Windows文件path,则有一个CoreFoundation方法可将其转换为CFURL / NSURL对象

 NSString *stringURL = @"\\\\SERVER\\FOLDER\\FOLDER\\FTP\\ANC\\ANC.pdf"; NSURL *url = (NSURL *)CFBridgingRelease(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, stringURL, kCFURLWindowsPathStyle, false)); 

如果string以file://开头,则这是一个带有filescheme的Mac URLstring,您可以使用

 NSString *fileURLString = @"file:///Applications"; NSURL *url = [NSURL URLWithString:fileURLString]; 

考虑一个有效的文件模式string在该scheme的两个斜线之后必须具有第三个斜杠作为根文件夹。

fileURLWithPath方法只能在string以单斜杠开始时使用,隐式添加file://scheme。

 NSString *pathString = "/Applications"; NSURL *url = [NSURL fileURLWithPath: pathString]; 

确保URL包含http://https:// 。 例如: http://SERVER/FOLDER/FILE.pdf

在iOS应用程序中访问文件时需要注意以下两点:

  • 如果您从iOS应用程序沙箱(文档或caching目录)访问文件,请使用以下命令:

     NSURL *url = [NSURL fileURLWithPath:strUrl]; 
  • 如果您正在从iOS应用程序的任何服务器访问文件,请使用以下命令:

     NSURL *url = [NSURL URLWithString:strUrl]; 

注意:从模拟器运行时,无法从iOS应用程序的Mac中访问文件。

希望这可以帮助!

请使用此代码检查您的代码

  -(void)downloadPdfBtnPressed:(id)sender { NSString *dowloadURL = [DownloadUrlArray objectAtIndex:[sender tag ]]; NSString *filename =[dowloadURL lastPathComponent]; NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"/Download"]; if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath]) [[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:nil]; NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:dowloadURL]]; if(pdfData) { stringPath = [stringPath stringByAppendingPathComponent:filename]; [pdfData writeToFile:stringPath atomically:YES]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[singletonObj getTranslationForKey:@"AlereTitleContactus"] message:@"PDF file is downloaded" delegate:nil cancelButtonTitle:[singletonObj getTranslationForKey:@"alertOK"] otherButtonTitles:nil]; [alert show]; } }