如何以编程方式确定我的OSX应用程序是否是从Applications目录启动的?

时间:2015-06-13 23:00:02

标签: objective-c macos

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

如果能够做到以下几点,我会很高兴:

  1. 以某种方式检测应用程序是否是从/ Applications目录
  2. 启动的
  3. 如果不是,则提议自动将应用程序从dmg移动到/ Applications目录,为用户启动,然后从那里启动
  4. 如果#2不是操作系统允许的内容,则显示警告,然后关闭应用程序。
  5. 我可以自己弄清楚#3,但我想知道#1和#2是否可能以及我如何去做它们。

3 个答案:

答案 0 :(得分:1)

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

然后,您可以使用NSURL获取应用网址的卷信息,并确定它是否是从DMG中启动的。 E.g:

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

答案 1 :(得分:1)

从这里https://github.com/potionfactory/LetsMove/开始,查看一些叉子,看它是不是你想要的。 很确定还有另一个图书馆可以做到这一点,但我现在无法找到它

答案 2 :(得分:0)

对于Unix,一般来说,应用程序的第一个参数(argv [0])是指向应用程序二进制文件的绝对路径的指针。检查" / Applications"的路径。此外,如果应用程序已从已安装的dmg启动,则路径将以" / Volumes"如果已通过从Finder中双击安装它。

你可以使用ps看到差异:

从已安装的dmg发布(使用Identity Finder.app作为示例):

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

从/ Applications:

发起

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