观看跨多个目标共享的应用程序

Watch app shared across multiple targets

我的项目有多个构建目标,因此我可以促进 "branded" 构建共享相同的代码,但每个目标都有唯一的包标识符和资产。我为我的一个应用程序目标创建了一个手表应用程序,它工作得很好。现在,我正在尝试为我的其他目标使用相同的手表应用程序和扩展程序。我想我可以很容易地复制监视目标(监视和扩展)并简单地更改所有 bundle id 引用以匹配其他目标,但似乎某个地方有一个隐藏的引用。

我只想为所有不同的品牌目标使用一个手表应用程序。

旁注:手表应用程序也需要正确标记(资产文件夹)。

有什么想法吗?谢谢。

解决方案更新

所以,我解决了。当我复制我的监视目标(监视和扩展),并更改包 ID、目标依赖项以及所有内容以使其与旧目标相同(但当然指向新目标)时,由于某种原因新监视目标没有t 指向正确的 watch 扩展目标。而且在任何地方都无法改变它。我尝试重新复制目标,但仍然遇到同样的问题。

所以我所做的是打开 project.pbxproj 文件,搜索对我的手表扩展(和包 ID)的任何引用并手动更新连接。我的 watch 目标依赖于错误的 watch 扩展,而新的 watch 扩展有一个指向旧 watch 扩展的指针。后来我还发现我必须将构建指向正确的产品参考(appex 参考),因为这也是错误的。

所以新的 watch 目标指向了错误的 watch 扩展名,而正确的 watch 扩展名指向了错误的 appex(输出文件)。所有这些我都必须在项目文件中手动更改。这听起来很极端和困难,但一旦你记下不同的 UUID,它实际上并不那么困难。

我希望这对可能遇到同样奇怪问题的其他人有所帮助。

您绝对不能将一个 Watch 应用程序用于多个目标。因为 Xcode 用于尝试确定是否将 Watch 配套应用程序包含到捆绑包中的唯一因素是 Watch 应用程序的捆绑包 ID。所以是一对一的关系。

接下来您应该为每个 iOS 应用目标复制每个 WatchOS 应用和扩展目标(仅更改包 ID)。但是您仍然可以使用 Target Membership 在目标之间共享您的代码(包括故事板和资产),它也解决了 b运行ded Watch 应用程序的问题。最后,您获得了最少的代码重复开销。

更新: 我看到您正在尝试通过右键单击目标并选择 Duplicate 选项来复制 Watch 目标。由于某种原因,它确实不起作用。

我刚刚尝试克隆一个 Watch 目标,执行以下步骤:

  1. 文件 -> 新建 -> 目标 -> WatchKit 应用程序。
  2. 指定了Embed in Companion Application所需的目标。
  3. 使用 Target Membership 选项将所有文件添加到新创建的目标。

之后构建了一个项目,运行 新的 Watch 目标没有任何问题。

这样您就不必手动更改包 ID - 一切都由 Xcode 自动顺利创建。

遇到类似的问题 "Error=MultipleWatchKitTwoApps ...(~/Library/Logs/CoreSimulator/CoreSimulator.log)",当我最终复制主要目标并手动添加手表 OS 套件时。

解决方案:观察到主要目标构建阶段 -> 目标依赖项将引用其他 watchkit 应用程序。删除并确保正确添加新的 watchOS 套件应用程序作为依赖项。

类似地在嵌入手表内容部分删除其他目标手表OS应用参考。

这将解决问题 "Error=MultipleWatchKitTwoApps ..."

我多次遇到这个 post 并尝试了所有方法都没有成功,最后,我找到了修复它的方法。我假设您有一个正在运行的 iOS 应用程序和一个正在运行的 Apple Watch 应用程序,并且您需要添加更多 Apple Watch 应用程序而不重复代码。

第 1 步:File/New/Target Select "WatchOS" 选项卡,然后 select "WatchKit App" Select 您想要的应用 link 使用这个新的 Apple Watch 应用程序单击下一步

第 2 步:查看为您的新 Apple Watch 应用创建的新文件夹并删除所有 *.swift 和 *.storyboard

第 3 步:Select 最初运行的第一个 Apple Watch 应用程序的 .storyboard 和 .swift 文件,您应该为它们分配新的和旧的 Target Membership。将来,您所有的手表应用程序文件都应该有这些目标 selected.

您可以通过为项目创建环境变量并在 plist 文件中分配来使用一个目标,如下图所示。

此外,您可以使用这样的帮助程序,根据包标识符在代码中进行所有标记

extension AppInfo {
    static var develop: Bool {
        return (self.CFBundleIdentifier?.contains("Dev") ?? false)
}