【发布时间】:2020-10-13 06:20:09
【问题描述】:
我正在存储文件 URL,以便在 iOS 应用程序的后续运行中检索它们。 URL 是由用户在其设备上选择本地或 iCloud 文件生成的。给定的 URL 似乎指向 Documents 中的一个文件,但实际上并不存在。
我有以下代码来解析书签中的 URL:
BOOL isBookmarkStale = false;
NSError* error = nil;
auto nsURL = [NSURL URLByResolvingBookmarkData:bookmark
options:NSURLBookmarkResolutionWithoutUI
relativeToURL:nil
bookmarkDataIsStale:&isBookmarkStale
error:&error];
书签是用
创建的if ([nsURL startAccessingSecurityScopedResource])
{
NSError* error = nil;
NSData* securityScopedBookmark = [nsURL bookmarkDataWithOptions:NSURLBookmarkCreationMinimalBookmark
includingResourceValuesForKeys:nil
relativeToURL:nil
error:&error];
[nsURL stopAccessingSecurityScopedResource];
}
我已经通过检查最后一个已知路径来验证存储的书签包含正确的 URL
NSDictionary *values = [NSURL resourceValuesForKeys:@[NSURLPathKey]
fromBookmarkData:static_cast<NSData*> (bookmarkData)];
NSString *path = [values objectForKey:NSURLPathKey];
这里的路径包含文件的最后一个 URL。我正在测试的本地文件中的 URL 字符串如下所示:/private/var/mobile/Containers/Data/Application/3BFEA0FB-AA84-4CFB-90E5-3535FA14738E/Documents/SomeFile.mp3
这似乎在应用程序运行时有效。但在重新启动或重建应用程序(调试构建)后,尝试从存储的书签中解析 URL 失败,并显示 NSCocoaErrorDomain Code=4 和消息“文件不存在”。
【问题讨论】:
-
我注意到模拟器在您运行它时会不断更改您的应用程序的 URL。这不会在设备上发生,但要在模拟器上进行测试,您需要存储相对于应用的主目录或文档目录的 URL。
-
好的 @skaak 感谢您的提示。我正在设备上运行,因为模拟器在选择文件时不起作用,可能是由于您提到的问题
-
是的,要返回 sim,您需要使 URL 相对。只有
.../Documents/...部分是稳定的,但你会得到正常的方式。我会为此发布一个答案,,,
标签: ios objective-c nsurl