【问题标题】:How to compare a URL of "file://localhost/var/mobile/..." with "file:///var/mobile/..."如何将“file://localhost/var/mobile/...”的 URL 与“file:///var/mobile/...”进行比较
【发布时间】:2012-06-30 12:49:07
【问题描述】:

我正在使用 UIWebView:loadRequest 和一个 NSURLRequest 打开一个本地文件,而 NSURLRequest 又是从一个 URL 设置的。

url 的基本位置通过以下方式获得:

    baseDirectory = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory
                                                                        inDomain:NSUserDomainMask
                                                                appropriateForURL:nil   
                                                                            create: YES
                                                                            error:&err];

这将返回表单的 URL:

file://localhost/var/mobile/Applications/Library/ApplicationSupport/ABC/XYZ/page.html

但是,当 UIWebViewDelegate shouldStartLoadForRequest:(NSURLRequest*) 方法被调用时,传递的 NSURLRequest 已更改为以下内容:

file:///var/mobile/Applications/Library/ApplicationSupport/ABC/XYZ/page.html

因此这两个都引用了同一个文件,但是我有一种情况,我需要在两者之间进行比较(我需要比较 /ABC/XYZ/page.html 部分)并且 NSURL:isEqual 返回 NO 时比较两者。

是否有: a) NSFileManager 的一个方法,它将返回 file:///var/mobile/... 而不是 file://localhost/var/mobile/...

b) 轻松提取 /ABC/XYZ/page.html 部分并对其进行比较?

【问题讨论】:

  • 这个问题不对,但请听我说:苹果不允许应用程序从文件系统的 root 获取信息是否有意义?应用程序意味着甚至可以访问沙盒之外的简单文件,例如 HTML 文件。

标签: ios uiwebview nsurl nsfilemanager


【解决方案1】:

如果您知道这两个文件将始终位于同一台机器上,那么[[URL1 path] isEqualToString:[URL2 path]]


以下单元测试通过:

- (void)testURLPath
{
    NSURL *URL = [NSURL URLWithString:@"file://localhost/foo/bar/baz"];
    NSString *path = [URL path];
    STAssertEqualObjects(path, @"/foo/bar/baz", nil);
}

- (void)testURLPathCompare
{
    NSURL *URL1 = [NSURL URLWithString:@"file://localhost/foo/bar/baz"];
    NSURL *URL2 = [NSURL URLWithString:@"file:///foo/bar/baz"];
    NSString *path1 = [URL1 path];
    NSString *path2 = [URL2 path];
    STAssertTrue([path1 isEqualToString:path2], nil);
    STAssertTrue([[URL1 path] isEqualToString:[URL2 path]], nil);
}

【讨论】:

  • 但是路径部分不是要包含 /localhost 而不是另一个。
【解决方案2】:

您可以尝试在两个 URL 上调用 URLByStandardizingPath 并比较这些结果而不是原始结果。

如果这不起作用,您可以通过在两个 URL 上调用 pathComponents 并比较两个返回数组中的最后一个对象和倒数第二个对象,只比较最后两个路径组件。

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 2017-12-24
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2013-10-18
    • 2017-05-20
    相关资源
    最近更新 更多