具有多个目标的iOS扩展
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有多个目标的iOS扩展相关的知识,希望对你有一定的参考价值。
在ios 8中,当我们创建一个新的扩展时,我们必须决定它附加到哪个目标。扩展名将具有与目标相同的捆绑包ID前缀。
- 之后有什么方法可以改变目标吗?
- 如果我的项目包含2个(或更多)目标(例如一个用于调试/模拟器,一个用于生产/设备),那么使用扩展的最佳方法是什么?我是否需要创建另一个扩展并复制代码(为两个目标保留相同的代码非常麻烦)?
要在很多目标中共享一个窗口小部件,应该只在Embedded Binaries
配置选项卡中为每个父目标添加widget.appex目标到General
然后你会自动在Embed App Extensions
获得Build Phases
区域
看起来您应该只能使用自己的Info.plist复制Extension目标,但不能复制任何其他内容。
但是,当您创建扩展时,Xcode会将“嵌入应用程序扩展”添加到应用程序目标的构建阶段,如下所示,并且还没有UI可以执行此操作。
仍然,您可以为第二个目标创建扩展,然后删除除.plist之外的所有文件,并修复需要修复的内容。这是一步一步:
- 为“目标1”创建“扩展1”
- 为“目标2”创建“扩展2”
- 删除为“Extension 2”创建的所有文件,但Info.plist除外
- 使“Extension 2”目标的“Build Phases”与“Extension 1”的构建阶段相同。通常,这会将必要的.m文件添加到“编译源”阶段,并将资源添加到“复制捆绑资源”阶段
这是我的设置:我有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创建多个扩展,但您可以创建动态框架并将其与每个扩展链接。然后,您将不需要复制您的代码。
以上是关于具有多个目标的iOS扩展的主要内容,如果未能解决你的问题,请参考以下文章
在具有部署目标 iOS 7.0 及更早版本的扩展包含应用程序中使用嵌入式框架
同一列表中的多个 ForEach 与具有一个 ForEach 的多个列表