具有多个目标的iOS扩展

问题描述 投票:31回答:5

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

  1. 之后有什么方法可以改变目标吗?
  2. 如果我的项目包含2个(或更多)目标(例如一个用于调试/模拟器,一个用于生产/设备),那么使用扩展的最佳方法是什么?我是否需要创建另一个扩展并复制代码(为两个目标保留相同的代码非常麻烦)?
ios duplicates ios8 target ios-app-extension
5个回答
26
投票

要在很多目标中共享一个窗口小部件,应该只在Embedded Binaries配置选项卡中为每个父目标添加widget.appex目标到General

enter image description here

然后你会自动在Embed App Extensions获得Build Phases区域

enter image description here


9
投票

看起来您应该只能使用自己的Info.plist复制Extension目标,但不能复制任何其他内容。

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

仍然,您可以为第二个目标创建扩展,然后删除除.plist之外的所有文件,并修复需要修复的内容。这是一步一步:

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

8
投票

这是我的设置:我有3个目标(生产,登台,本地)和扩展目标,我不想重复3次。

只是为了澄清Neo Chen的答案,编辑你的每个父目标的方案:

构建>预执行>新运行脚本操作>从(父方案)提供构建设置。

粘贴每个扩展名:

#!/bin/bash

buildID=${PRODUCT_BUNDLE_IDENTIFIER}
extId="notification-service"

/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $buildID.$extId" "${SRCROOT}/${extId}/Info.plist"

似乎在第一次构建时工作。


4
投票

我已经创建了一个Run Script来支持这个要求

#!/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 Phases中的扩展设置之前运行,然后你只需要执行两次构建操作(PS:第一次它会失败,会尝试改进)它会支持多个目标


1
投票

您需要为每个ID创建多个扩展,但您可以创建动态框架并将其与每个扩展链接。然后,您将不需要复制您的代码。

© www.soinside.com 2019 - 2024. All rights reserved.