我的第一选择是在我的应用程序中创建类似窗口的查找器并在其中打开文件,这样您就可以完全控制自己的操作。
第二种选择可能是创建可编写脚本的可可应用程序。这可以提供您在问题中描述的功能,它也与沙盒兼容。来自 Apple:Gatekeeper 和签名小程序。
从上面的链接总结。
Gatekeeper 和签名小程序 OS X Mountain Lion 包括 Gatekeeper,它通过应用有关允许下载的软件运行的策略来保护用户免受恶意软件的侵害。Gatekeeper 依靠代码签名来验证应用程序:保证签名的应用程序是由签名者创建的,并且在签名后没有被修改。默认情况下,Gatekeeper 将只允许运行已由 Mac App Store 或指定开发者签名的应用程序。如果您编写脚本应用程序(“小程序”)进行分发,则此政策适用于您的小程序。要签署您的小程序,以便 Gatekeeper 的默认策略不会阻止它们:
我们需要的:
- 创建 *.sdef 文件,该文件定义应用程序的可脚本性信息。可脚本性信息
- 将 Cocoa 脚本支持添加到您的应用程序Cocoa Support for Scriptable Applications
- 创建 Applescript 以打开“命名”的 Finder 窗口并将信息发送回您的 Cocoa 应用程序,反之亦然。
- 从您的应用程序调用 Applescript,反之亦然。
您需要创建 *.sdef 文件,它是一种基于 XML 的格式,描述了一组可脚本性术语以及描述应用程序可脚本性的命令、类、常量和其他信息。您需要将此文件添加到您的项目中。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary title="YOUR_APP_NAME">
<suite name="scriptTest Suite" code="MApN" description="YOUR_APP_NAME Scripts">
<command name="myFirstCommand" code="lkpstrng" description="The array to lookup">
<cocoa class="MyLookupCommand"/>
<direct-parameter description="The array to lookup">
<type type="any" list="yes"/>
</direct-parameter>
<result description="returns and array" type="text"/>
</command>
</suite>
</dictionary>
将 *.sdef 文件包含到您的项目中后,您需要向 info.plist 添加两个新键。Scriptable = YES 和脚本定义文件名。
cocoa class
在定义为 的脚本定义文件中MyLookupCommand
,我们需要在 Cocoa 应用程序中创建这个类。MyLookupCommand
类它是子类NSScriptCommand
。H
#import <Foundation/Foundation.h>
@interface MyLookupCommand : NSScriptCommand
@end
.m
#import "MyLookupCommand.h"
@implementation MyLookupCommand
-(id)performDefaultImplementation {
// get the arguments
NSDictionary *args = [self evaluatedArguments];
NSString *stringToSearch = @"";
if(args.count)
{
stringToSearch = [args valueForKey:@""];
}
else
{
// error
[self setScriptErrorNumber:-50];
[self setScriptErrorString:@"Parameter Error......."];
}
// Implement your code logic
[[NSNotificationCenter defaultCenter] postNotificationName:@"AppShouldLookupStringNotification" object:stringToSearch];
return [NSString stringWithFormat:@"result: %@", [NSDate date]];
}
@end
这就是您从 Applescript 捕获通信的方式。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[textbox1 setStringValue:[NSString stringWithFormat:@"%05d", 1]];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(getValueFromScript:)
name:@"AppShouldLookupStringNotification"
object:nil];
}
-(void)getValueFromScript:(NSNotification *)notification
{
[yourTextbox setStringValue:[NSString stringWithFormat:@"from notification center %@", notification.object]];
}
下一步,我们需要一个 Applescript 来从 Cocoa 应用程序获取/设置命令。
//In SDEF file we declared return type as array, here we created one.
set groceryList to {"eggs", "milk", "bread"} //the variable which you want to send to your app.
//Scripting language is pretty straight forward. If "named" window exists invoke the command and send return type to your Cocoa app.
tell application "Finder"
activate
if ((count of windows) > 0) then
if name of front window is "YOUR_DESIRED_FINDER_WINDOW_NAME" then
tell application "System Events"
set running_apps to every application process's name
if running_apps does not contain "YOUR_COCOA_APP_NAME" then
tell application "AppleScript Editor" to activate
end if
end tell
tell application "AppleScript Editor"
if it is running then
tell application "AppleScript Editor"
myFirstCommand groceryList //Updated this line.
end tell
end if
end tell
end if
end if
end tell
当然,您还需要从您的 Cocoa 应用程序中调用 Applescript 小程序。请查看如何从可可应用程序调用 Applescript - regulus6633 的答案