私のセットアップ:Mac OS X 10.7.4 Xcode 4.3.2
10.6SDKに対して構築されたMacOSXドキュメントベースのアプリがあります。
以前は、SnowLeopardのXcode3でこのアプリを作成していました。
最近、アプリのプロジェクトを更新して、Lion上のXcode4でビルドできるようにしました(ただし、10.6 SDKに対してビルドを続けています)。
Xcode4 / Lionでビルドした後、AppleScriptの動作に奇妙な変化があり、根本的な原因を見つけることができないことに気づきました。問題はこれです:
AppleScript open documentコマンドは、開かれ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
(作成されたドキュメントが本当に必要な場合)ようにするにはどうすればよいですか?
アップデート
私は非常に驚くべき何かを発見しました!
問題のアプリには2つの化身があります。独立配布用またはMacAppStore経由の配布用に構築できます。それぞれの化身は、私のXcodeプロジェクトでは別々の(しかし非常に似ている)ターゲットです。ターゲットと呼びましょう:
MyAppIndie
と
MyAppAppStore
この問題はインディーアプリでのみ発生することがわかりました。この問題は、アプリのAppStoreビルドでは発生しません。
また、 IndieとAppStoreの両方のターゲットを持つ別のドキュメントベースのOS Xアプリがあり、ここで説明したのと同じ問題が発生しています。
両方のアプリのAppStoreバージョンは正しく機能します。しかし、両方のアプリのインディーバージョンにはこの問題があります。
両方のアプリで2つのターゲットの間にほとんど違いはないと思っていましたが、明らかに何かが異なります。私は今、すべての違いを特定し、原因を見つけようとしています。
うーん。近くなってる。