我正在尝试使用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' 型
答案 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]];