查找启动OS X应用程序的文件名



设置文件的信息,您可以将应用程序与特定的文件类型相关联,以便在单击时启动应用程序。我的问题是应用程序如何发现导致它启动的文件的完整文件名。

Mac应用程序不会在每次打开关联文件时启动。它们可能已经启动,但如果它们已经在运行,则只要求它们打开另一个文件。因此,路径不会通过命令行到达应用程序。它以消息的形式发送给应用程序,应用程序需要处理运行循环(NSRunLoop(才能接收它

在常规的Cocoa程序中,实现NSApplicationDelegate,并实现方法(在ObjC命名中(:

- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;

如果您只支持10.13+,首选方法已更改为:

- (void)application:(NSApplication *)application openURLs:(NSArray<NSURL *> *)urls;

当你的应用程序需要打开一个文件时,如果有一个NSApplication对象正在运行以接受它,操作系统会调用它。通常,你可以通过调用NSApplicationMain()来创建NSApplication对象,但如果需要,你可以实现自己版本的NSApplicationMain()(有关详细信息,请参阅NSApplication文档(。

通过自己实现Apple Events并响应odoc(打开文档;{ kCoreEventClass, kAEOpenDocuments }(消息,可以在没有NSApplication或任何Objective-C的情况下响应这些打开请求。要对此进行攻击,请参阅《苹果事件编程指南》。

您应该期望编写一些安装事件处理程序的代码,如:

err     = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
NewAEEventHandlerUPP(OpenDocumentsAE), 0, false);
require_noerr(err, CantInstallAppleEventHandler);

然后,您将实际处理OpenDocumentsAE中的消息(取自"Open Documents Apple Event的处理程序"(:

static pascal OSErr OpenDocumentsAE(const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefcon)
{
AEDescList  docList;
FSRef       theFSRef;
long        index;
long        count = 0;
OSErr       err = AEGetParamDesc(theAppleEvent,
keyDirectObject, typeAEList, &docList);// 1
require_noerr(err, CantGetDocList);// 2
err = AECountItems(&docList, &count);// 3
require_noerr(err, CantGetCount);
for(index = 1; index <= count; index++)// 4
{
err = AEGetNthPtr(&docList, index, typeFSRef,
NULL, NULL, &theFSRef, sizeof(FSRef), NULL);// 5
require_noerr(err, CantGetDocDescPtr);
err = OpenDocument(&theFSRef);// 6
}
AEDisposeDesc(&docList);// 7
CantGetDocList:
CantGetCount:
CantGetDocDescPtr:
if (err != noErr)// 8
{
// For handlers that expect a reply, add error information here.
}
return(err);// 9
}

相关内容

最新更新