Cocoa / Objective-c'系统();'表现得很奇怪

时间:2009-10-11 09:21:24

标签: objective-c cocoa terminal applescript system

我正在尝试使用system()在我的Cocoa应用程序中运行一个applescript; function - 我传递给函数的字符串在终端工作,而applescript本身很好,我认为它与NSString有关 - 有人可以帮忙吗?

        //add to login items
        NSLog(@"add to login");
        NSString *pathOfApp = [[NSBundle mainBundle] bundlePath];
        NSString *theASCommandLoginItem = [NSString stringWithFormat:@"/usr/bin/osascript -e 'tell application \"System Events\" to make login item at end with properties {path:\"%@\"}'", pathOfApp];
        system(theASCommandLoginItem);
        NSLog(theASCommandLoginItem);

这是输出:

  

2009-10-11 20:09:52.803 The Talking   Cloud Notifier [3091:903]添加到登录   sh:\ 340HH:找不到命令   2009-10-11 20:09:52.813会话   云通知器[3091:903]   / usr / bin / osascript -e'告诉   应用程序“系统事件”   最后使用属性登录项目   {路径:“/用户/输入csmith /桌面/的   会说话的云通知器/构建/调试/   Talking Cloud Notifier.app“}'

在编译时我也会收到警告:

  

警告:传递参数1   来自不兼容指针的'system'   型

2 个答案:

答案 0 :(得分:14)

由于newacct的回答已经建议您必须使用C字符串而不是NSString system()函数。

改为使用NSTask

更好

对你来说更有用的是NSAppleScript类:

NSAppleScript *script;
NSDictionary *errorDict;
NSAppleEventDescriptor *returnValue;
// multi line string literal
NSString *scriptText = @"tell application 'System Events'\n"
                        "make login item at end with properties {path:\"%@\"}\n"
                        "end tell";
scriptText = [NSString stringWithFormat:scriptText, pathOfApp];
script = [[[NSAppleScript alloc] initWithSource:scriptText] autorelease];
returnValue = [script executeAndReturnError:&errorDict];
if (returnValue) {
     // success
} else {
     // failure
}

最佳

关于如何将您的应用注册为登录项,请查看Apple's documentation。甚至有一些例子。

答案 1 :(得分:4)

system()是一个C库函数,它采用常规C字符串(char *),而不是NSString *

您可以使用NSString

之类的内容将[theASCommandLoginItem UTF8String]转换为C字符串

或者您可以使用Objective-C自己的运行命令的方式,例如:

[NSTask launchedTaskWithLaunchPath:@"/usr/bin/osascript"
                         arguments:[NSArray arrayWithObjects:@"-e",
                                                             [NSString stringWithFormat:@"tell application \"System Events\" to make login item at end with properties {path:\"%@\"}", pathOfApp],
                                                             nil]];