我的设置: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 版本都可以正常工作。但是这两个应用程序的独立版本都有这个问题。
我原以为两个应用程序中的两个目标之间几乎没有区别,但显然有些不同。我现在正试图找出所有差异并找到罪魁祸首。
人力资源管理系统。越来越近。