【问题标题】:How can I programmatically determine if my OSX app was launched from the Applications dir?如何以编程方式确定我的 OSX 应用程序是否从 Applications 目录启动?
【发布时间】:2015-06-20 02:04:26
【问题描述】:

我已经为 OSX 构建了一个应用程序,并为它构建了一个 .dmg 安装程序。但是,一些用户无法按照背景图像中的巨大箭头告诉他们将应用程序拖到 /Applications 文件夹。 ;-)

如果可以做到以下几点我会很好:

  1. 以某种方式检测应用程序是否从 /Applications 目录启动
  2. 如果不是,请为用户自动将应用从 dmg 移动到 /Applications 目录,然后从那里启动
  3. 如果 #2 不是操作系统允许的,则显示警报,然后关闭应用程序。

我可以自己找出 #3,但我想知道 #1 和 #2 是否可能,以及我该如何解决它们。

【问题讨论】:

  • 您可能对PFMoveApplication感兴趣。
  • 谢谢,这正是我想要的。您也许应该将其发布为答案,而不是评论。
  • FWIW,这个库有一个限制,它不支持沙盒应用程序。

标签: objective-c macos


【解决方案1】:

[NSBundle mainBundle] 代表您的应用程序包。您可以使用它来获取应用的 URL。

然后,您可以使用 NSURL 获取应用 URL 的音量信息,并确定它是否从 DMG 中启动。例如:

NSURL* bundleUrl = [[NSBundle mainBundle] bundleURL];
NSString* volumeName = nil;
if ([bundleUrl getResourceValue:&volumeName forKey:NSURLVolumeNameKey error:nil])
{
    if ([volumeName isEqual:@"My App Installer"]) // or whatever your DMG volume name is
    {
        [self tryMigratingToAppsFolder];
    }
}

或者,您可以检查它是否不在/Applications 中。请记住,有些人会在不同的位置安装应用程序。

NSURL 可用卷资源的完整列表is available here

【讨论】:

    【解决方案2】:

    从这里开始https://github.com/potionfactory/LetsMove/,如果不是您想要的,请检查一些分叉。 很确定还有另一个库也可以这样做,但我现在找不到它

    【讨论】:

    • 谢谢。我确实最终使用了 LetsMove 库,但这是几天前上面@Ken 的建议。效果很好!
    【解决方案3】:

    对于一般的 Unix,应用程序的第一个参数 (argv[0]) 是指向应用程序二进制文件的绝对路径的指针。检查“/ Applications”的路径。此外,如果应用程序是从挂载的 dmg 启动的,则如果从 Finder 中双击该应用程序已被挂载,则路径将以“/Volumes”开头。

    使用ps可以看出区别:

    从挂载的 dmg 启动(以 Identity Finder.app 为例):

    $ ps aux|grep 身份 迈克尔 52525 0.0 0.5 926072 80804 ?? U 12:14PM 0:02.92 /Volumes/Identity Finder/Identity Finder.app/Contents/MacOS/Identity Finder

    从 /Applications 启动:

    $ ps aux|grep 身份 迈克尔 52562 0.0 0.7 976212 116736 ?? S 12:16PM 0:03.24 /Applications/Identity Finder.app/Contents/MacOS/Identity Finder

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多