0

我有一个 App Store 应用程序,其中免费版不可编写脚本,但高级版可编写脚本。AppleScript 支持是主要区别之一。我知道 App Store 的评论者越来越倾向于免费 + 应用内购买,这将有助于清理 App Store。好吧,我会打球。

现在我需要以编程方式做一些我一直只是在构建中工作的事情。

  • 如果 my和设置在 my 中,有没有办法禁用AppleScript ?这仍然允许人们打开字典,也许他们会喜欢他们看到的内容并考虑激活升级。或者,OSAScriptingDefinitionNSAppleScriptEnabledInfo.plist

  • 事后有没有办法启用AppleScript ?显然,通过代码签名,我无法修改 Info.plist 或稍后将我的 SDEF 添加到包中。但也许如果 SDEF 位于非标准位置,我可以从包中加载它并手动告诉系统它。

SDEF 是否必须存在于我的捆绑包中?如果不是,我不确定如何在沙箱中指向用户的应用程序支持目录。我还考虑过 xinclude 一个我可以在事后安装的 SDEF,但同样,SDEF 和 plist 需要实际的目录路径而不是函数。

我尝试了一些方法,例如尝试将 NSScriptSuiteRegistry 的单例设置为 nil,但没有效果。

因为OSAScriptingDefinitionNSAppleScriptEnabled启用“自动”支持,如果不在 plist 中,肯定必须有一种手动方式使它们生效,并希望使用公共 API。

这里有什么想法吗?谢谢!

4

2 回答 2

1

CocoaScripting 是一个黑盒子,适应性不强。最简单(kludgy)的解决方案是等到 CS 安装其 Apple 事件处理程序,然后调用-[NSAppleEventManager setEventHandler:andSelector:forEventClass:andEventID:]以用总是发回“需要应用内购买”错误的虚拟处理程序替换这些事件处理程序。(显然不要替换标准open的 ,quit等处理程序。)

于 2019-11-12T15:39:34.843 回答
1

定位的几点:

  • 所有 AppleScript 命令都是NSScriptCommand
  • 所有 AppleScript 对象都由 NSScriptObjectSpecifier
  • 应用程序的可脚本性由其共享实例控制NSScriptSuiteRegistry

这为您提供了一些选择。例如,您可以尝试NSScriptSuiteRegistry setSharedScriptSuiteRegistry:在免费版本中覆盖并将其设置为 nil。您还可以编写一个类别NSScriptCommand和/或NSScriptObjectSpecifier进行版本检查。这将为您提供细粒度的控制:您可以从任何处理脚本命令或返回脚本对象的方法中调用它,并即时决定您要允许哪些以及要阻止哪些;甚至可能会弹出一个“为完整的 AppleScript 访问付费”对话框。

于 2019-11-11T21:39:46.997 回答