Apple Watchkit 模拟器问题:SPErrorInvalidBundleNoGizmoBinaryMessage

Apple Watchkit simulator issue: SPErrorInvalidBundleNoGizmoBinaryMessage

当我打开我现有的 Watchkit 应用程序 (Xcode 6.2) 时,它编译正确,模拟器启动 (iPhone+Watch),随后是有意义的错误:

启动错误'xxx Watchkit Extension' SPErrorInValidBundleNoGizmoBinaryMessage

我对所有模拟器都有这个问题(iPhone 5/5S/6/6+ - 38mm/42mm)

知道问题出在哪里吗?

似乎出于某种原因,应用程序不想 运行 在模拟器上,即使它曾经是。与其他 Watchkit 示例应用程序一样,同一项目中包含的 iPhone 应用程序 运行。

您是否更改了应用的捆绑包 ID?如果是这样,您可能需要手动更新 WatchKit 扩展中的 WKAppBundleIdentifier 以及 WatchKit 应用程序中的 WKCompanionAppBundleIdentifier。

WKAppBundleIdentifier 可能需要与 WatchKit App 的 Bundle Identifier 相同。

请检查 WatchKit Extension 的 info.plist。 NSExtension - NSExtensionAttributes - WKAppBundleIdentifier - xxxxx.watchkitapp

编辑:进一步解释以澄清...

在您的 App 目标下,您转到 INFO 选项卡并将 Bundle Identifier 设置为 com.myapp

然后在 WatchKit Extension 目标下,转到 INFO 选项卡并将 Bundle Identifier 设置为 com.myapp.watchkitextension

然后仍然在 WatchKit 扩展目标和信息选项卡下,您将 NSExtension > NSExtensionAttributes > WKAppBundleIdentifier 设置为 com.myapp.watchkitapp

所以一个以 .watchkitextension 结尾,另一个以 .watchkitapp 结尾

检查 Info.plist“您的 App WatchKit 扩展”和“您的 App WatchKit 应用程序”。所有标识符的第一部分应该相同。

在我的例子中,问题出在“你的 App WatchKit 扩展”> NSExtension > NSExtensionAttributes > WKAppBundleIdentifier。

我多次检查了所有的包标识符,但无法解决这个问题。清理构建文件夹也没有用。

但是,我能够通过 关闭 Game Center我的 WatchKit Extension 的功能中解决这个问题。

为 iOS 主机应用程序打开它似乎工作正常,但为 WatchKit 扩展打开它会导致 SPErrorInvalidBundleNoGizmoBinaryMessage 尝试 运行 模拟器中的 WatchKit 应用程序,它在没有任何投诉的情况下完成构建。

我正在为 Apple Watch 开发游戏,期待支持 Game Center。实际上我从一开始就计划与托管 iOS 应用程序通信来这样做,但后来我看到 Game Center 列在 WatchKit 扩展本身的功能中,所以我希望能够处理它在那里。但是,由于它似乎不起作用,我将坚持我最初的计划,通过托管 iOS 应用程序支持它。

Xcode 版本 6.2 (6C131e)

编辑: 与 Xcode 版本 6.3 (6D570) 相同的问题

我已经尝试了迄今为止在此线程中发布的所有内容,但仍然无法正常工作。我求助于回溯到它工作的那一点,并回溯我所做的每一个动作,以确定它在哪一点中断...

事实证明,WatchKit 应用程序的 info.plist 文件不喜欢任何自定义 plist 条目,至少这是我在我的案例中发现的。我添加了一个名为 "MyAppBundlePrefix" 的条目,它导致了 "Error Launching 'xxx Watchkit Extension' SPErrorInValidBundleNoGizmoBinaryMessage"

我希望 XCode 能为该错误提供更具体的细节,但我花了大约 5 个小时才通过蛮力找到它。

对于真实设备(而非模拟器)上的问题,请执行此 post 中的所有操作: http://blog.jaredsinclair.com/post/117350678170/jareds-code-signing-tips-apple-watch-edition

最重要的是:

All three targets require the following:

a unique app ID for that target a code signing identity (applies to all targets) a unique provisioning profile for that target.

并确保应用 ID 一致:

Your app IDs will look something like this:

com.company.App-Name

com.company.App-Name.todaywidget

com.company.App-Name.watchkitapp

com.company.App-Name.watchkitextension

如果还是不行,请手动从手表中删除该应用程序(按住图标然后点击 'x'),然后重试。这是为我做的踢球者。

确保您使用的是 8.3 模拟器。

我在使用 8.2 时一直收到此消息。尝试了此处列出的所有内容并为此苦苦挣扎了几个小时。切换到 8.3 解决了它。具有讽刺意味的是,因为你现在 必须 将部署目标设置为 8.2,但 watchkit 应用程序需要 8.3 才能 运行 我猜...

我解决问题的过程是

  1. 检查WatchKit扩展和WatchKit App中的WKAppBundleIdentifier和bundle标识符是否正确
  2. 删除 ~/Library/Developer/CoreSimulator/Devices
  3. 的子文件夹
  4. 删除 ~/Library/Developer/Xcode/DerivedData
  5. 的子文件夹
  6. 清理我的项目
  7. 重启模拟器
  8. 运行

我也一直在努力解决这个问题。这就是我在 Xcode 7.1 iOS 9 上的问题的解决方法。 请确保您遵循以下标识符命名方式:

  • 目标 - com.myCompany.myApp
  • Watchkit 应用程序 - com.myCompany.myApp.watchkitApp
  • Watchkit 扩展 - com.myCompany.myApp.watchkitApp.watchkitextension

扩展应该有 WatchKit 应用目标的标识符 + .watchkitextension