3

Mavericks (またはそれ以前の Mountain Lion) では問題がなかったので、これは Yosemite に固有の問題だと思います...

SMLoginItemSetEnabled を使用して起動時に実行するヘルパー アプリを登録するアプリケーションを作成しました。ここでは何の問題もありません。これはうまくいきます。

SMLoginItemSetEnabled は、バンドル識別子 (「com.MyCompany.MyApp」など) を取得し、Launch Services を介してそのバンドルのパスを見つけ、起動時に実行することで機能します。

問題は、プロジェクトを「アーカイブ」すると、アーカイブ ビルド出力が Launch Services のバンドルのパスとして自動的に登録されることです。Yosemite では、そのバンドルを /Applications にコピーして実行しても、Launch Services は引き続きビルド パスを指します。私のアプリはサンドボックス化されているため、OSX は起動時にヘルパーの実行を拒否します。

例えば:

$ osascript -e 'tell application "Finder" to set targetAppPath to (application file id "com.MyCompany.MyApp") as string'
Macintosh HD:Users:myuser:Library:Developer:Xcode:Archives:2014-10-30:MyApp 10-30-14, 9.57 AM.xcarchive:Products:Applications:MyApp.app

$ osascript -e 'tell application "Finder" to set targetAppPath to (application file id "com.MyCompany.MyAppHelper") as string'
Macintosh HD:Users:myuser:Library:Developer:Xcode:Archives:2014-10-30:MyApp 10-30-14, 9.57 AM.xcarchive:Products:Applications:MyApp.app:Contents:Library:LoginItems:MyAppHelper.app

バンドルを /Applications にコピーし、現在その場所から実行しているにもかかわらず、起動サービスはまだビルド パスを指しています。

Mavericks と Mountain Lion では、Launch Services がデバッグ ビルド ディレクトリを指すパスを持っているため、最後にアプリを実行したときに xcode の [再生] ボタンを使用してデバッグ モードにすると、同様の問題が発生しました。しかし、アーカイブを作成して /Applications にコピーし、そこから実行するとすぐに、すべてがうまくいきました。Yosemite は、バンドルのバージョンが変更された場合にのみ Launch Services データベースを更新するようです。バンドルをある場所から別の場所にコピーするだけでは更新されません。

誰にもアイデアはありますか?コードまたはコマンド ラインを使用して、強制的に Launch Services にバンドルへのパスを更新させる方法はありますか?

4

0 に答える 0