3

我的设置:Mac OS X 10.7.4 Xcode 4.3.2

我有一个基于 10.6 SDK 的 Mac OS X 基于文档的应用程序。

以前,我总是在 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

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

所以我深入研究了代码,试图找出导致这种变化的原因。我注意到原因似乎与此方法的行为有关:

-[NSApplication handleOpenScriptCommand:]

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

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

-[NSDocument openDocumentWithContentsOfURL:display:]

并立即返回。这会导致 AppleScriptopen命令接收missing value为它的返回值。

所以我试图弄清楚我做了什么来使这种变化发生。

首先,我怀疑我(错误地)使用了10.6 中引入的异步文档打开功能。但是,我检查了,我没有覆盖这个方法:

+[NSDocument canConcurrentlyReadDocumentsOfType:]

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

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

这并没有解决我的问题。

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

更新

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

有问题的应用程序有两个化身:它可以为独立分发或通过 Mac App Store 分发而构建。在我的 Xcode 项目中,每个化身都是一个单独的(但非常相似的)目标。让我们调用目标:

MyAppIndie

MyAppAppStore

我发现这个问题只发生在独立应用程序中。该问题不会发生在应用程序的 AppStore 构建中。

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

我的两个应用程序的 AppStore 版本都可以正常工作。但是这两个应用程序的独立版本都有这个问题。

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

人力资源管理系统。越来越近。

4

0 回答 0