我的设置: 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版本都能正常运行。但两个应用程序的独立版本都有这个问题。
我原以为两个应用程序中两个目标之间的差异很小,但显然有些不同。我现在正试图找出所有差异并找到罪魁祸首。
槽糕。越来越近了。