在框架中嵌入另一个框架(iOS 8+)

15
使用Xcode 6或更高版本构建的iOS应用程序可以在其中嵌入动态iOS框架。我正在构建一个共享框架,并希望嵌入子框架。我该如何实现这一点?
注意:这是可能的,并且正在生产中使用(例如,在CocoaPods中使用Swift框架)。
3个回答

12

找到了答案。以下是操作步骤:

  • Navigate to Target > Build Phases
  • Click the small "+" icon and select "New Run Script Build Phase"
  • Paste the following:

    cd $BUILT_PRODUCTS_DIR
    
    mkdir $PROJECT_NAME.framework/Frameworks &>/dev/null
    
    for framework in *.framework; do
        if [ $framework != $PROJECT_NAME.framework ]; then
            cp -r $framework $PROJECT_NAME.framework/Frameworks/ &>/dev/null
        fi
    done
    

4
这是可行的,但需要补充一点:嵌入子框架的框架称为“组合框架”,苹果不建议使用。请参考这个问题的出色答案以了解原因:https://dev59.com/ams05IYBdhLWcg3wPfcR您应该这样做:不要嵌入子框架,最好将您的框架与其依赖项分开发布。 - Jonathan Ellis
1
@JonathanEllis 这并不总是理想的。例如,我使用WebP.framework添加了WebP支持。我不希望我的主应用程序、照片编辑扩展和iMessage扩展都必须包含一个单独的WebP.framework副本。这会浪费空间... - jjxtra
如果您正在构建WebP作为静态框架,那么链接3次是浪费空间的。但是,根据您的用例,您不应将其构建为静态框架。动态框架只需要包含一次,所有其他使用者在运行时链接和解析库即可。您不需要一个总框架来获得此行为 - 实际上,苹果不鼓励这样做。 - James H

7

@Vatsal Manot的回答对我非常有帮助。我稍微修改了一下,并且需要签署复制的嵌入式框架。我的脚本如下。

cd $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Frameworks/Custom.framework/Frameworks
for framework in *.framework; do
    mv $framework $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Frameworks/
    /usr/bin/codesign --force --sign "iPhone Developer" --preserve-metadata=identifier,entitlements --timestamp=none $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Frameworks/$framework
done

2
要创建一个包含子框架的伞形框架,您可以按照这里写下的逐步指南进行操作:Umbrella framework

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接