【问题标题】:URL passed in application openURL: does not exist在应用程序 openURL 中传递的 URL:不存在
【发布时间】:2014-01-10 16:05:25
【问题描述】:

当在我的应用程序中调用用于处理打开的文件(来自另一个应用程序)的 App Delegate 方法时,它传递给我的应用程序的 URL 是 nil... 或者至少这是 NSFileManager 告诉我的,因为文件确实存在于它指定的位置。

为什么NSFileManager 告诉我应用程序文档收件箱中文件的文件 URL 不存在?以下是我处理 URL 的方式:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if (![[NSFileManager defaultManager] fileExistsAtPath:[url absoluteString]]) {
        NSLog(@"File does not exist at path: %@", [url absoluteString]);
    } else {
        ...
    }
}

我一直试图弄清楚这一点,但我想不出任何原因来解释为什么这里的 url 参数会注册为不存在。这可能是一件非常简单的事情。可能absoluteString 的事情让 NSFileManager 出错了?

有什么想法吗?我找了又找,但一无所获——而且什么也想不出来。

【问题讨论】:

  • 在使用 NSFileManager 之前尝试检查 url [url isFileURL]。
  • 放一个断点并检查url
  • @stosha 我确实检查了文件isFileURL 是否返回YES。

标签: ios objective-c nsfilemanager nsurl


【解决方案1】:

将(文件)URL 转换为路径的正确方法是path,而不是 absoluteString

if (![[NSFileManager defaultManager] fileExistsAtPath:[url path]]) {
   ...

来自-[NSURL path]的文档:

如果此 URL 对象包含文件 URL(由 isFileURL 确定), 该方法的返回值适合输入到 NSFileManager 或 NSPathUtilities。

另一方面,absoluteString 返回一个 URL 字符串,如“file:///path/to/file”。

【讨论】:

    【解决方案2】:

    这里的第一个错误是您使用的是-[NSURL absoluteString]。你想要path

    但是,另一个问题甚至可能是测试文件是否存在。这很少有用,无论如何您都应该尝试对文件执行一些操作,处理发生的任何故障。

    如果您真的确实必须测试它的存在,请改用更现代的-[NSURL checkResourceIsReachableAndReturnError:]

    【讨论】:

    • 最后一点很高兴知道!知道Apple何时添加该API吗?是在 7.0 中吗?
    • 文档非常清楚地指出:“在 iOS 5.0 及更高版本中可用。(符号存在于 iOS 4 中,但不执行任何操作。)”
    【解决方案3】:

    你应该在使用 NSFileManager 之前检查 url:

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        if (url && [url isFileURL])
        {
            if (![[NSFileManager defaultManager] fileExistsAtPath:[url absoluteString]]) {
            NSLog(@"File does not exist at path: %@", [url absoluteString]);
            } 
            else 
            {
               ...
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 2016-01-07
      • 2010-09-12
      • 2021-10-30
      • 2018-09-12
      • 1970-01-01
      相关资源
      最近更新 更多