bundle作为MacOSX 10.5上的Launch Daemon运行时,Path返回空

时间:2011-11-10 20:39:11

标签: macos cocoa

我有一个Cocoa命令行应用程序,它是针对10.5 SDK构建的。在应用程序中,我有

NSString *appPath = [[NSBundle mainBundle] bundlePath];
NSLog(@"%@", appPath);

在Mac OSX 10.5上,当我从命令行运行应用程序时,我得到了路径的预期输出。但是,如果我将应用程序设置为LaunchDeamon,它只会输出'/'

它在10.6和10.7上的预期效果与Deamon和app一样。任何人都知道为什么会有差异?有没有更好的方法来获得适用于10.5 +的应用程序路径?

更新

对我来说,接受的答案中的解决方案不起作用。但是,关于将“WorkingDirectory”键添加到LaunchDeamon的plist文件的注释已经解决了。显然这是Mac OS X 10.5所必需的,但不是10.6 +。

1 个答案:

答案 0 :(得分:1)

感谢您回答我的澄清问题。

NSBundle依赖于现有的捆绑包,其中包含相关的Info.plists和捆绑ID(例如com.apple.textedit.app)等。

虽然单个二进制文件不是一个捆绑包,但我猜测Apple工程师修复了[[NSBundle mainBundle] bundlePath]以便在10.6和10.6中做“正确的事情”。 10.7。但是你仍然需要10.5的解决方案。

也许UNIX库函数char * getcwd(char *buf, size_t size)可以帮助您到达目的地。

为了获得正确的解决方案,我建议使用类似这样的代码进行运行时条件检查:

+ (NSString *) getAppPath
{
    NSString * appPath = NULL;
    SInt32  minorVersionNum;
    OSErr   err;

    err = Gestalt(gestaltSystemVersionMinor,&minorVersionNum);

    // do this only if we're running on anything *older* than 10.6
    if((noErr == err) && (minorVersionNumber < 6)) 
    {
        // hopefully the below define is enough space for any returned path
        #define kMaxPathLength 512 

        size_t bufferLength = kMaxPathLength;
        char bufferToHoldPath[kMaxPathLength]; 

        // initialize the buffer & guarantee null-terminated strings
        bzero(&bufferToHoldPath,bufferLength);
        if( getcwd(&bufferToHoldPath, bufferLength) != NULL)
        {
            appPath = [NSString stringWithUTF8String: bufferToHoldPath];
        }
    } 

    // this code runs for 10.6 and *newer*, and attempts it on
    // 10.5 only if the above getcwd call failed
    if(NULL == appPath)
    {
        appPath = [[NSBundle mainBundle] bundlePath];
    }

    return(appPath);
}

我做了测试此代码,所以YMMV。