具有多个目标的iOS扩展

在iOS 8中,当我们创build一个新的扩展,我们必须决定它附加到哪个目标。 该扩展将具有与目标相同的捆绑ID的前缀。

  1. 之后有什么方法可以改变目标吗?
  2. 如果我的项目包含2个(或更多)目标(例如一个用于debugging/模拟器,一个用于生产/设备),那么使用扩展的最好方法是什么? 我是否需要创build另一个扩展并复制代码(非常麻烦,以保持两个目标相同的代码)?

要在大量目标中共享一个小部件,应该只在“ Generalconfiguration”选项卡中将widget.appex目标添加到每个父目标的Embedded Binaries

在这里输入图像说明

然后,您将在Build Phases自动获取Embed App Extensions区域

在这里输入图像说明

看来你应该能够复制扩展目标与自己的Info.plist,但没有其他的东西。

但是,当您创build扩展时,Xcode会将“embedded应用程序扩展”添加到应用程序目标的构build阶段,如下所示,并且没有UI可以执行此操作。

在这里输入图像说明

不过,您可以为第二个目标创build扩展,然后删除.plist以外的所有文件,并修复需要修复的问题。 这里是一步一步的:

  • 为“目标1”创build“扩展名1”
  • 为“目标2”创build“扩展名2”
  • 删除为“Extension 2”创build的所有文件,但Info.plist除外
  • 使“扩展2”的“构build阶段”的目标与“扩展1”的构build阶段相同。 通常这是将必要的.m文件添加到“编译源”阶段,并将资源添加到“复制捆绑软件资源”阶段

您需要为每个ID创build多个扩展,但是您可以创builddynamic框架并将其与每个扩展连接起来。 那么你将不需要复制你的代码。

我已经创build了一个运行脚本来支持这个要求

 #!/bin/sh buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${SRCROOT}/ImagePush/Info.plist" buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE") /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildVersion" "${SRCROOT}/ImagePush/Info.plist" buildID=${PRODUCT_BUNDLE_IDENTIFIER} /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $buildID.ImagePush" "${SRCROOT}/ImagePush/Info.plist" 

ImagePush是我的扩展

添加到你需要的目标和添加确保这个脚本运行之前,你的扩展设置在构build阶段,那么你只需要做两次构build行动(PS:第一次将失败,将尝试改善),它会支持多个目标