Xcode 6.3 + 尝试 运行 模拟器中的 Watch App 结果 "FBSOpenApplicationErrorDomain error 4"

Xcode 6.3 + trying to run the Watch App in simulator results in "FBSOpenApplicationErrorDomain error 4"

我正在为我的一个应用程序编写一个 Watch App。由于我的团队还没有 Apple Watch,我也在我的构建服务器上为我的 QA 团队构建了我的应用程序的模拟器版本,他们正在使用 "xcrun simctl" 到 运行 并测试手表应用程序本身。

一切顺利,直到 Xcode 6.3 到来。 使用 Xcode 6.3,当我尝试在我的开发机器上本地构建应用程序时收到此错误:

error: The value of CFBundleVersion in your WatchKit app's Info.plist (1) does not match the value in your companion app's Info.plist (2.0.492). These values are required to match.

为了解决这个问题,我修改了我的 info.plist 文件以包含相同的 CFBundleVersion。此修改解决了我本地开发机器上的构建问题,但是:QA 仍然能够 运行 iOS 应用程序,但是启动 Watch App 失败并出现此错误:

> xcrun simctl launch 0D5238ED-CBE9-4DCC-961D-BC756E0885CD com.company.enterprise.appname.watchapp
An error was encountered processing the command (code=4):
The operation couldn’t be completed. (FBSOpenApplicationErrorDomain error 4.)

我在系统控制台日志中看不到任何与此相关的内容。 :/

你知道如何解决这个问题吗?

在此先感谢您的帮助!

为了让 Watch 应用正常运行,某些属性必须在 Watch 应用及其应用扩展 (18857540) 中匹配:

  • WatchKit App Extension的Info.plist中NSExtensionAttributesWKAppBundleIdentifier 属性必须匹配WatchKit App的Info.plist.
  • 的CFBundleIdentifier
  • WatchKit 应用程序 Info.plist 的 WKCompanionAppBundleIdentifier 属性 必须匹配包含 iOS 应用程序 Info.plist 的 CFBundleIdentifier

我也运行对此感兴趣。

基本上,您应该有 3 个目标(如果算上测试,则为 4 个)。如果你检查构建阶段,你会发现 WatchKit App 必须首先编译,然后是 WatchKit Extension,最后是主应用程序。

我有一个我使用多年的脚本,每次编译应用程序时都会自动更新 CFBundleVersion。

扩展和主应用程序的构建阶段中有一个 "Run Script" 的位置,但 WatchKit 应用程序没有。

因此,首先编译的是 WatchKit 应用程序,然后将其移至构建目录。它将具有上次手动输入的 CFBundleVersion 中的任何数字。

获得运行的第二件事是扩展编译。这是我的脚本 运行s 和更新数字的地方。但是,这个数字现在比 WatchKit 应用程序中的数字多了一个,它已经被移动到构建目录。因此,即使它们开始使用相同的数字(比如 1),但当扩展名移过去时,它现在是 2,并且存在不匹配。

无法使用 运行 脚本以自动方式更新 WatchKit 应用程序 CFBundleVersion。

就个人而言,我要解决的方法是在我想要更改时在我的 WatchKit 应用程序中手动设置 CFBundleVersion,然后我将在构建阶段使用 运行 脚本对于其他两个目标,将 CFBundleVersion 从 WatchKit App 复制到它们各自的 CFBundleVersions 中,以保持它们全部同步。

长话短说,您需要跟踪三个 CFBundleVersions 并确保它们都是相同的数字。

我发现是将 CFBundleGetInfoString 添加到 watchKit Extension/watchKitApp 导致了我的问题(可以将它放在配套的 iOS 应用程序本身中)。删除它解决了我的问题。

defaults delete `pwd`/myApp WatchKit Extension/Info CFBundleGetInfoString
defaults delete `pwd`/myApp WatchKit App/Info CFBundleGetInfoString