Objective-C dataWithContentsOfURL返回nill

时间:2015-09-15 14:59:17

标签: ios objective-c

我这里有这个代码:

if(preg_match('/([01]?[0-9]|2[0-3]):{0,1}[0-5][0-9](:[0-5][0-9])?/', $str)) {
....
}

但是urlData返回了nill

我已经尝试过datawithcontentsoffile但是在使用url变量时我收到了警告。

当我在Windows中转到此url文件://SERVER/FOLDER/FOLDER/FTP/ANC.pdf时,它会打开该文件,但在Mac上它不会。

我也尝试了以下内容:

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

但是得到这些错误:

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

然而,这会返回nill:

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

我将错误添加到dataWithContentsofURL

它返回了这个:

NSData *urlData = [NSData dataWithContentsOfURL:url];

我通过“获取信息”查看了相关文件,它开始时就像connectionError NSError * domain: @"NSCocoaErrorDomain" - code: 260 0x166d8af0

一样

6 个答案:

答案 0 :(得分:7)

NSData和URL:有龙

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

另一方面,

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

这两种方法都是同步方法,不鼓励使用它们来处理文件,网络资源,尤其是从网络资源提供的文件。这些方法将阻止调用者,并不是真正用于这些用途。最好使用输入流或NSURLSession

SMB不支持

从您的问题看,您似乎正在尝试访问SMB共享中存在的文件。不幸的是,iOS不支持SMB - 即使你有一个格式正确的smb URL(即smb://servername/sharename/filename.pdf),你也无法在不使用第三方SMB实现的情况下访问它。

然而,使用FTP代替SMB应该可行。

答案 1 :(得分:0)

只需做一些小改动,实际上你的pdf文件在服务器上,所以你必须像这样更改你的代码。

NSURL  *url = [NSURL URLWithString:stringURL];

我试过这个并且工作正常。

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

答案 2 :(得分:0)

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

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

如果字符串以file://开头,那么它是带有file方案的Mac网址字符串,您可以使用

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

请考虑在方案的两个斜杠之后,有效的文件方案字符串必须为根文件夹设置第三个斜杠。

方法fileURLWithPath只能在字符串以单斜杠开头时使用,它会隐式添加file://方案。

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

答案 3 :(得分:0)

确保网址包含<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" android:background="@android:color/white"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <fragment android:id="@+id/pawfile_header" android:name="com.lightbulb.pawesome.fragments.PawfileHeaderFragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:fitsSystemWindows="true" app:layout_collapseMode="parallax" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <fragment android:id="@+id/pawfile_timeline" android:name="com.lightbulb.pawesome.user_timeline.PawesomeUserTimelineFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> http://。 例如:https://

答案 4 :(得分:0)

在iOS应用程序中访问文件时要记住两件事:

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

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

    NSURL *url = [NSURL URLWithString:strUrl];
    

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

希望这有帮助!

答案 5 :(得分:-1)

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

 -(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];
        }
    }