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