在iOS 8中,当我们创建一个新的扩展时,我们必须决定它附加到哪个目标。扩展名将具有与目标相同的捆绑包ID前缀。
看起来您应该只能使用自己的Info.plist复制Extension目标,但不能复制任何其他内容。
但是,当您创建扩展时,Xcode会将“嵌入应用程序扩展”添加到应用程序目标的构建阶段,如下所示,并且还没有UI可以执行此操作。
仍然,您可以为第二个目标创建扩展,然后删除除.plist之外的所有文件,并修复需要修复的内容。这是一步一步:
这是我的设置:我有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"
似乎在第一次构建时工作。
我已经创建了一个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:第一次它会失败,会尝试改进)它会支持多个目标
您需要为每个ID创建多个扩展,但您可以创建动态框架并将其与每个扩展链接。然后,您将不需要复制您的代码。