使用Cocoa的上次打开的文档

时间:2013-01-24 02:14:19

标签: objective-c cocoa

有没有办法获取应用程序的最后打开的文件?我知道使用LSSharedFileListCreate你可以获得用户的全局最新文档数组,但我想知道是否有可能使用cocoa或objective-c获取特定应用程序(如Xcode)的最新文档。

2 个答案:

答案 0 :(得分:3)

我认为没有公共API可以获取您自己以外的应用程序的最新文档。最近的文件在~/Library/Preferences中保存为plists,因此您可以直接阅读这些文件。

但是请注意,这些plist的格式可能会随着未来的操作系统升级而改变,因此理想情况下不应该依赖于此。

以下是阅读Xcode最新文档的示例:

NSString *bundleID = @"com.apple.dt.Xcode";
NSString *prefPath = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"Preferences"];
NSString *recentFilesFileName = [bundleID stringByAppendingPathExtension:@"LSSharedFileList.plist"];
NSString *recentFilesPath = [prefPath stringByAppendingPathComponent:recentFilesFileName];

NSArray *recentDocumentItems = [[[NSDictionary dictionaryWithContentsOfFile:recentFilesPath] objectForKey:@"RecentDocuments"] objectForKey:@"CustomListItems"];
for (NSDictionary *recentDocumentItem in recentDocumentItems) {
    NSString *name = [recentDocumentItem objectForKey:@"Name"];
    NSData *bookmarkData = [recentDocumentItem objectForKey:@"Bookmark"];
    NSError *error = nil;
    NSURL *bookmarkURL = [NSURL URLByResolvingBookmarkData:bookmarkData options:NSURLBookmarkResolutionWithoutMounting | NSURLBookmarkResolutionWithoutUI relativeToURL:nil bookmarkDataIsStale:NULL error:&error];
    if (bookmarkURL) {
        NSLog(@"File name: %@", name);
        NSLog(@"URL: %@", bookmarkURL);
    } else {
        NSLog(@"Could not resolve URL for file %@: %@", name, error);
    }
}

当然,这不适用于沙盒应用程序。

答案 1 :(得分:2)

您可以使用-[NSDocumentController recentDocumentURLs],它会检索最近打开的文档的网址数组:

NSArray *array = [[NSDocumentController sharedDocumentController] recentDocumentURLs];