在 AppleScript 中从 Objective-c 调用方法或函数

Call a method or function from Objective-c in AppleScript

我正在尝试使用 LestMove 来更精确 第二种实现方法,它说:

选项 2:

将以下文件复制到您的项目中:

PFMoveApplication.h PFMoveApplication.m 如果您的项目启用了 ARC,您需要在上述文件上禁用 ARC。您可以通过将 -fno-objc-arc 编译器标志添加到 PFMoveApplication.m 源文件来实现。参见 How can I disable ARC for a single file in a project?

如果您的应用程序已本地化,也请将 'MoveApplication.string' 文件复制到您的项目中。

Link 您针对 Security.framework 的申请。

在您的应用委托的“-[applicationWillFinishLaunching:]”方法中,调用最顶部的 PFMoveToApplicationsFolderIfNecessary 函数。

但我无法调用方法 / Class,有人可以帮我解决这个问题吗?提前致谢!

一般来说,有几种方法可以在您的 AppleScriptObjC 项目中设置 Objective-C class:

  • 将文件添加到项目中 - Objective-C class 名称将是 @interface/@implementation 声明中使用的
  • 在您正在使用的 AppleScript class/script 中添加一个插座 属性,例如property someProperty : missing value

    1. 以编程方式实例化 class:

      set someProperty to current application's ClassName's alloc's init()

    1. 使用 Interface Builder 连接东西:
      • 将库中的 NSObject(蓝色立方体)添加到您的项目
      • 将 object/cube 的 class 设置为 Identity Inspector[=91] 中 Objective-C 文件的 class 名称=]
      • 将 AppDelegate IB Outlet 连接到 Connections Inspector
      • 中的 object/cube
  • 设置出口 属性 后,Objective-C 方法可以像任何其他方法一样使用 script/class:

    someProperty's handler()


那个 LetsMove 项目并不是真正为 AppleScriptObjC 设置的,但我可以稍微调整一下以获得它 运行。我不太擅长 编写 Objective-C,但以下内容对我有用,在 Mojave 中使用 Xcode 10 的新默认 AppleScript 项目(原始文件是超过 500 行,所以我只是突出显示更改):

  1. PFMoveApplication.hPFMoveApplication.m 文件添加到项目中(class 名称为 LetsMove
  2. 构建阶段
  3. 中将Security.framework添加到Link带库的二进制文件
  4. 如原始项目 README 中所述,将编译器标志 -fno-objc-arc 添加到 Compile Sources 中的 Objective-C 文件中构建阶段

-- 现在稍微修改 Objective-C 文件:

  1. @interface 声明移至 .h 文件并在其中包含以下重新定义的方法签名:
  2. PFMoveToApplicationsFolderIfNecessaryPFMoveIsInProgress方法被重新定义为实例方法:

    - (void)PFMoveToApplicationsFolderIfNecessary;
    - (BOOL)PFMoveIsInProgress;
    
  3. .m 文件中重新定义上述方法签名,并将这些方法包含在 @implementation 部分 - 为此,将 @end 移动到辅助方法之前(在 PFMoveIsInProgress 方法之后)
  4. 删除PFMoveToApplicationsFolderIfNecessary方法开头的isMainThread语句-这不是不需要的(AppleScript通常在主线程上运行),并修复了另一个问题
  5. 其中仍然有一些来自原始应用程序的东西,例如 NSUserDefaults,所以对于您自己的项目,看看是否还有其他需要更改的内容(对话框文本等)

最后,在 AppDelegate.applescipt 文件中,将以下内容添加到 applicationWillFinishLaunching:

    current application's LetsMove's alloc's init()'s PFMoveToApplicationsFolderIfNecessary()