2

当我尝试为我的临时文件(在此代码中为“toString”)记录系统上的所有可用编辑器时,它总是返回 null,尽管我的系统上安装了许多应用程序。

NSArray *appUrls = (NSArray*)LSCopyApplicationURLsForURL((CFURLRef)[NSURL URLWithString:toString], kLSRolesViewer | kLSRolesEditor);

toString 包含以下文件路径: /var/folders/pl/tcc5k3fd6tj2__9dprg9dm1m0000gp/T/tempFile

这里应该是什么问题?

4

2 回答 2

4
[NSURL URLWithString:toString]

需要一个完整的 URL 字符串,包括方案,例如“file://var/folders/...”。

采用

[NSURL fileURLWithPath:toString]

而是获取具有指定路径的文件 URL。

另一个问题可能是您的文件名没有任何文件扩展名(例如“.txt”),因为 Launch Services 使用扩展名(或文件类型/创建者)来查找合适的应用程序。

于 2012-11-08T10:29:28.627 回答
0

我为此苦苦挣扎,我想获得所有可以打开确定的路径/文件扩展名的捆绑包。

如果您有文件扩展名,则可以通过以下方式获取所有可以编辑它的捆绑包:

//All Bundle Ids
NSString *pathExtension = @"docx";
CFArrayRef utisRef = UTTypeCreateAllIdentifiersForTag(kUTTagClassFilenameExtension,(__bridge  CFStringRef) pathExtension,nil);
NSLog( @"UTI: utisRef %@", utisRef);
NSArray *utis = CFBridgingRelease(utisRef);
NSMutableSet *mutableSet = [[NSMutableSet alloc] init];
for (NSString *uti in utis) {
    CFArrayRef bundleIDsRef = LSCopyAllRoleHandlersForContentType((__bridge  CFStringRef) uti,kLSRolesEditor);
    [mutableSet addObjectsFromArray:CFBridgingRelease(bundleIDsRef)];
}
NSLog( @"bundleIDs: %@", mutableSet);

如果您有文件路径并且想要获取所有可以编辑它的应用程序位置,您可以使用以下命令:

//Location of apps
NSString *str = @"/Users/ricardoanjos/Library/Developer/Xcode/DerivedData/EgnyteDrive-hforbniifiojczefbnwanzxakvlr/Build/Products/Debug/1.pdf";
NSURL* url = [[NSURL alloc] initFileURLWithPath:str];
CFURLRef urlRef = (__bridge CFURLRef)url;
CFArrayRef appUrlsRef = LSCopyApplicationURLsForURL(urlRef, kLSRolesEditor);
NSArray *appUrls = CFBridgingRelease(appUrlsRef);
NSLog(@"appUrls: %@", appUrls);

我希望它会有所帮助。

于 2019-02-13T09:24:53.180 回答