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

Objective c 如何以编程方式确定我的OSX应用程序是否从Applications目录启动?,objective-c,macos,Objective C,Macos,我已经为OSX构建了一个应用程序,并为它构建了一个.dmg安装程序。但是,一些用户在跟随背景图像中的巨大箭头时遇到问题,该箭头告诉他们将应用程序拖到/Applications文件夹中。;-) 如果能够做到以下几点,我将不胜感激: 以某种方式检测应用程序是否从/Applications目录启动 如果不是,为用户提供自动将应用程序从dmg移动到/Applications目录,然后从那里启动 如果操作系统不允许使用#2,则显示警报,然后关闭应用程序 我可以自己算出#3,但我想知道#1和#2是否可能,以

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

如果能够做到以下几点,我将不胜感激:

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

  • 我可以自己算出#3,但我想知道#1和#2是否可能,以及我如何处理它们。

    [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可用卷资源的完整列表。

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

    您可以使用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

    由以下地址/应用程序启动:

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

    从这里开始,如果你不想要的话,可以查看一些叉子。
    我很确定还有另外一个图书馆也能做到这一点,但我现在找不到,你可能会感兴趣。谢谢,这正是我要找的。你也许应该把它作为一个答案,而不是一个评论。FWIW,这个库有一个限制,它不支持沙盒应用。谢谢。我确实最终使用了LetsMove库,但几天前它是根据上面@Ken的建议使用的。它工作得很好!