我认为这是Yosemite特有的问题,因为我在小牛队(或之前的Mountain Lion)中没有任何问题......
我有一个我编写的应用程序,它使用SMLoginItemSetEnabled注册一个帮助应用程序,以便在启动时运行。 我这里没有任何问题;这很好。
SMLoginItemSetEnabled通过获取包标识符(例如“com.MyCompany.MyApp”),通过Launch Services查找该包的路径,并在启动时运行它来工作。
问题在于,当我“归档”我的项目时,归档构建输出会自动注册为Launch Services中的bundle路径。在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中,如果我最后一次运行应用程序是通过xcode中的“play”按钮处于调试模式,我遇到了类似的问题,因为Launch Services将指向调试构建目录的路径。但是一旦我构建了存档并将其复制到/ Applications并从那里运行它,一切都很好。如果捆绑包的版本发生了变化,Yosemite似乎只会更新启动服务数据库,并且只是将捆绑包从一个地方复制到另一个地方就不会发生这种情况。
有没有人有任何想法?有没有办法强制Launch Services在代码中或通过命令行更新bundle的路径?