代码之家  ›  专栏  ›  技术社区  ›  Bri Bri

macOS/Cocoa:用户在磁盘上移动应用程序后,如何获取正在运行的应用程序主包的路径?

  •  0
  • Bri Bri  · 技术社区  · 7 年前

    在macOS应用程序中,如果需要获取应用程序路径或其捆绑包中的任何资源,当然可以使用 mainBundle 静态法 NSBundle :

    NSBundle *bundle = [NSBundle mainBundle];
    NSString *appPath = [bundle bundlePath];
    NSString *resourceFolderPath = [bundle resourcePath];
    ... etc ...
    

    但是,如果用户将应用程序包移动到磁盘上的其他位置 当应用程序运行时 ,则此方法将不起作用。上述所有函数仍将返回用户移动捆绑包之前的旧路径。

    你怎么能拿到那份工作 现在的 捆绑包的路径或其中任何资源的路径,无论用户是否已将其移动到磁盘上?

    到目前为止,我已经尝试使用 NSRunningApplication 要获取其当前位置,请执行以下操作:

    NSRunningApplication *thisApp = [NSRunningApplication runningApplicationWithProcessIdentifier:getpid()];
    NSLog(@"bundle URL: %@", [thisApp bundleURL]);
    

    ...但这也回到了捆绑的老路!

    2 回复  |  直到 7 年前
        1
  •  2
  •   Darren    7 年前

    通常不支持移动已经运行的应用程序。如果这是您真正需要支持的场景,那么您可以执行以下操作:

    • 当应用程序第一次启动时,像往常一样获取应用程序的当前路径,然后为该路径创建一个NSURL书签。

    • 当你需要知道应用的当前路径时,你可以解析你在启动时创建的NSURL书签。书签将解析为应用程序的当前路径,即使应用程序已被移动。

    有关NSURL书签的更多信息,请访问: https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW10

        2
  •  1
  •   zneak    7 年前

    虽然macOS不在乎文档打开时是否移动,但它 如果你移动应用程序,你会在意的。这是一个 long-recognized issue 在macOS开发中。

    应用程序开发人员往往不在乎,或者在启动时询问用户是否想将应用程序移动到应用程序目录,而不是试图与之抗争(因为这是应用程序最常见的移动目的地)。 LetsMove 是一个展示你将如何做到这一点的项目。