iOS8 - 多个目标的单个小部件

Posted

技术标签:

【中文标题】iOS8 - 多个目标的单个小部件【英文标题】:iOS8 - Single Widget for multiple targets 【发布时间】:2014-07-03 09:36:17 【问题描述】:

Apple 在 WWDC 2014 中引入了“小部件”的概念。小部件用于快速访问包含急需信息的应用程序。我试图将小部件添加到我的应用程序中。当我们在应用程序中只有一个 Target 时,这很容易。

但是,如果我们有多个 Target,似乎我们需要为每个 Target 添加单独的 Widget。是否可以添加单个小部件并使其与所有目标共享?

提前致谢。

【问题讨论】:

您找到问题的答案了吗? 【参考方案1】:

这当然是可能的。我有一个名为 DD-WRT 的应用程序,它有 3 个单独的目标。基本上 1 用于 iPhone,1 用于 iPad,1 是免费的“精简版”。 (我已经将 iPhone 和 iPad 做成了同一个通用应用,但仍然需要在 App Store 上维护所有 3 个)。

我想为所有 3 个应用添加 today widget,但只有一个代码库,就像应用本身一样。

那我是怎么做到的……

首先为您的应用目标之一添加today widget 目标。您可以通过选择Editor > Add Target 并从Application Extension 部分选择Today Extension 来执行此操作。

为小部件目标命名并选择此小部件将分配到的应用程序目标之一。

您现在将在文件检查器中看到一组新文件,您将在其中编写小部件

现在对您拥有的每个其他应用构建目标执行完全相同的过程,但为每个应用赋予稍微不同的名称并为每个应用选择不同的应用目标。你应该有这样的东西

现在您还将拥有多个我们不想要的小部件文件。我们只想使用一组文件。这里的秘密在于小部件的Info.plist 文件。 bundle identifier 必须与包含应用程序的 bundle identifier 匹配。因此,重命名每个小部件的 Info.plist 文件,以便您知道哪个是针对哪个目标的,然后将它们全部移动到您创建的第一个小部件的文件夹中。您现在可以删除额外小部件的文件和文件夹。

你现在应该有这样的东西:

现在您需要告诉每个扩展目标您更改了 .plist 文件名。

Build Settings 选项卡下,在搜索框中输入plist,然后将Info.plist file 的条目编辑为此目标的plist 名称。

现在您必须将所有小部件文件设置为每个目标的成员。对于默认的TodayViewController.mMainInterface,storyboard 文件,选择它们,然后在File inspector 窗口中勾选每个目标。像这样:

记得在添加新文件时选择所有扩展目标。

我发现我必须做的最后一件事(我花了很长时间研究崩溃,直到我弄明白了)。在General 选项卡中,对于每个扩展目标,单击Main Interface 下拉框并重新选择MainInterface 故事板。尽管它看起来已经被选中,但它实际上是选中了你删除的那些。重新选择它可以确保您指向唯一剩下的那个。

希望就是这样。给每个目标一个Clean,然后构建并运行每个目标。

【讨论】:

多么好的答案,谢谢! (+1) 感谢您的帮助,我为所有目标(小部件目标)使用了相同的 plist 谢谢!我要补充:如果你通过 userdefaults 向扩展发送数据,不要忘记检查 AppGroups 开关 此解决方案不适用于最新版本的 xcode。今天你还有另一个文件 exept plist (.entitlements, .intentdefinition) 所以它不会工作。唯一对我有用的是结合来自***.com/questions/25398636/…最合适的解决方案+他们说我们需要在预构建中添加的脚本。【参考方案2】:

我遇到了完全相同的问题。实现今天的小部件并希望将其与目标设置一起用于开发/部署和测试 (Testflight)。

我最终创建了第二个小部件,添加了所有需要的文件,并使用与另一个小部件完全相同的 StoryBoard。所以唯一需要维护的是第二个 info.plist。我想不出任何更简单的方法来实现这一点。

在一切正常之前,由于某些原因,我不得不清理目标并重置模拟器。

希望这会有所帮助。

【讨论】:

【参考方案3】:

我通过每个目标都有一个扩展来解决这个问题,然后只有一个扩展拥有所有类,并且每个类的目标成员资格包括每个扩展目标。

这有一个额外的好处,我可以在其关联的扩展中使用一些资源,例如来自主要目标的颜色资产目录。

【讨论】:

以上是关于iOS8 - 多个目标的单个小部件的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 iOS8 中为同一个应用程序创建多个今天的扩展小部件吗?

单个小部件的多个 PendingIntent

如何将单个小部件与多个提供程序一起使用?

QDataWidgetMapper 将多列映射到单个自定义小部件的多个属性

如何在 Flutter 中对齐单个小部件?

使用多个小部件进行委托