我有一个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 +。
答案 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。