Mac OS X基于文档的应用程序:AppleScript“打开”命令返回“缺失值”而不是打开的文档

时间:2012-05-24 00:09:07

标签: objective-c macos cocoa applescript

我的设置: Mac OS X 10.7.4 Xcode 4.3.2

我有一个基于Mac OS X Document的应用程序,它是针对10.6 SDK构建的。

以前,我一直在Snow Leopard上的Xcode3中构建这个应用程序。

我最近更新了应用程序的项目,以便在Lion上的Xcode4下构建它(尽管我仍在构建10.6 SDK)。

在Xcode4 / Lion下构建之后,我注意到AppleScript行为发生了一个奇怪的变化,我无法找到根本原因。问题是:

AppleScript打开文档命令返回missing value而不是打开的文档。

所以这段代码:

tell application "MyApp"
    set doc_ to open (get path to desktop as string) & "test.myext"
    doc_ -- prints the return value in the console
end tell
当我的应用程序在Xcode3 / Lion下构建时,

在控制台中打印出以下值:

document 1 of application "MyApp"
当我的应用程序在Xcode4 / Lion下构建时,

但是在控制台中打印出以下值:

missing value

但是,在这两种情况下,文档都会按预期打开并显示。唯一的问题是AppleScript open命令的返回值。

所以我挖掘代码以试图找出导致此更改的原因。我注意到原因似乎与此方法的行为有关:

-[NSApplication handleOpenScriptCommand:]

在Xcode3下构建时,此方法会阻塞,直到在我的应用程序中创建NSDocument。这允许AppleScript open命令接收我的新文档作为其返回值。

但是,在Xcode4下构建时,此方法在创建NSDocument之前不会阻塞。相反,它似乎触发了一些异步调用

-[NSDocument openDocumentWithContentsOfURL:display:]

立即返回。这会导致AppleScript open命令接收missing value作为其返回值。

所以我想弄清楚我做了什么让这种变化发生。

首先,我怀疑我是(误)使用10.6中引入的 Asynchronous Document Opening 功能。但是,我查了一下,并没有覆盖这个方法:

+[NSDocument canConcurrentlyReadDocumentsOfType:]

所以我甚至尝试覆盖它并返回NO

+ (BOOL)canConcurrentlyReadDocumentsOfType:(NSString *)typeName {
    return NO;
}

这并没有解决我的问题。

那么有人可以提供建议吗?我如何打破AppleScript open命令以使其异步执行(当我真的想要同步时)并返回missing value(当我真的想要创建的文档时)?

更新

我发现了一些非常令人惊讶的事情!

有问题的应用程序有两个版本:它可以为独立发行版或通过Mac App Store分发。每个化身都是我的Xcode项目中的一个独立(但非常相似)的目标。我们打电话给目标:

MyAppIndie

MyAppAppStore

我发现此问题只发生在独立应用中。问题不会发生在应用程序的AppStore版本中。

,我还有另一个基于文档的OS X应用程序,该应用程序同时具有Indie和AppStore目标,并且它表现出与此处描述的相同的问题!

我的两个应用程序的AppStore版本都能正常运行。但两个应用程序的独立版本都有这个问题。

我原以为两个应用程序中两个目标之间的差异很小,但显然有些不同。我现在正试图找出所有差异并找到罪魁祸首。

槽糕。越来越近了。

0 个答案:

没有答案