在Xcode 10.2和iOS 12中编写自定义通用框架
作为开发人员,我们希望尽可能多地编写可重用的代码集,以便以后可以将这些组件与多个应用程序一起使用,并使生活变得轻松。
注意 :有关iOS面试问题,请查看此链接—您必须在2018年准备的iOS面试主要问题
框架是模块化的和可重用的代码集,用作高级软件的组成部分。 框架具有三个主要目的:
- 代码封装
- 代码模块化
- 代码重用
使用框架的最好理由是它们可以被构建一次,并且可以无限制地重复使用!
入门
让我们从创建自定义框架开始,使其通用,以便可以在模拟器以及设备上使用它。
让我们打开Xcode并创建一个新项目。 选择iOS选项卡,向下滚动到Framework & Library
然后选择Cocoa Touch Framework
。
- 为您的框架项目选择一个模板
2.输入产品名称并填写其他详细信息
填写完所有详细信息并按下一步后,您的项目就可以按以下所示进行构建了–
如果您构建项目,则它将生成TestFramework.framework作为产品,该产品将根据开发人员选择的选项支持模拟器或设备。
您当前的状态是一个没有代码的框架,这和没有糖的纯巧克力一样吸引人。 在框架中添加逻辑或功能,然后尝试构建它。 我们专注于创建通用框架,因此编写代码和资源部分留给开发人员去探索更多或等待另一部分。
现在是时候学习了,如何使自定义框架成为可在模拟器和设备上使用的通用框架。
3.创建新方案,选择项目目标→新建模式
请输入新的架构名称-ProjectName – Universal 。
现在是时候使用这种模式来创建通用框架了。 我写了一个“运行脚本”来生成通用框架。
选择项目目标 → 编辑模式 → 存档 → 后操作 → 按“ +” →“ 新建运行脚本操作” 。
然后复制粘贴下面的脚本代码。
UNIVERSAL_OUTPUTFOLDER = $ {BUILD_DIR} / $ {CONFIGURATION} -Universal #确保输出目录存在 mkdir -p“ $ {UNIVERSAL_OUTPUTFOLDER}” ##接下来,确定我们是否在模拟器或REAL DEVICE中 xcodebuild -target“ $ {PROJECT_NAME }“-配置$ {CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH = NO BUILD_DIR =” $ {BUILD_DIR}“ BUILD_ROOT =” $ {BUILD_ROOT}“ clean buildxcodebuild-目标” $ {PROJECT_NAME}“ ONLY_ACTIVE_ARCH = NO-配置$ {CONFIGURATION sdk iphoneos BUILD_DIR =“ $ {BUILD_DIR}” BUILD_ROOT =“ $ {BUILD_ROOT}” clean build #步骤2。将框架结构(从iphoneos构建)复制到通用文件夹 cp -R“ $ {BUILD_DIR} / $ {CONFIGURATION} -iphoneos / $ {PROJECT_NAME} .framework“” $ {UNIVERSAL_OUTPUTFOLDER} /“ #步骤3.将Swift模块从iphonesimulator版本(如果存在)复制到复制的框架目录 BUILD_PRODUCTS =” $ {SYMROOT} /../.。 /../../Products"cp -R“ $ {BUILD_PRODUCTS} / Debug-iphonesimulator / $ {PROJECT_NAME} .framework / Modules / $ {PROJECT_NAME} .swiftmodule /。” “ $ {UNIVERSAL_OUTPUTFOLDER} / $ {PROJECT_NAME} .framework / Modules / $ {PROJECT_NAME} .swiftmodule” #步骤4.使用lipo创建通用二进制文件,并将合并后的可执行文件放在复制的框架目录中 lipo -create -output“ $ { UNIVERSAL_OUTPUTFOLDER} / $ {PROJECT_NAME} .framework / $ {PROJECT_NAME}“” $ {BUILD_PRODUCTS} / Debug-iphonesimulator / $ {PROJECT_NAME} .framework / $ {PROJECT_NAME}“” $ {BUILD_DIR} / $ {CONFIGURATION} -iphoneos / $ {PROJECT_NAME} .framework / $ {PROJECT_NAME}“ #步骤5.将框架复制到项目目录中的便捷步骤 cp -R” $ {UNIVERSAL_OUTPUTFOLDER} / $ {PROJECT_NAME} .framework“” $ {PROJECT_DIR}“ #步骤6.便利步骤在Finder中打开项目的目录
打开“ $ {PROJECT_DIR}”
科幻
将上面的脚本复制粘贴到您的项目中之后,它看起来将与此类似–
存档完成后将执行此运行脚本。 通用框架将在项目目录本身中生成并打开。
您准备好共享通用框架。 哇!!
要共享框架,请右键单击框架的软链接,然后选择“显示框架的原始路径”选项,然后可以在项目中复制和使用它。
将通用框架复制/拖动到该项目。 在Project Explorer中处理框架时,选中“如果需要 , 复制项目” 。
选择项目,选择目标→项目名称→选择常规→滚动到“嵌入式二进制文件” 。 按“ +”并添加框架。
现在,通用框架将同时在模拟器和设备上运行。 但是仍然有一个问题。
假设应用程序在生产中使用我们的自定义通用框架,我们需要删除未使用的架构。 因为Apple不允许具有未使用架构的应用程序进入App Store。
请确保您已删除未使用的体系结构 在您的项目中添加脚本 同时将您的应用发布到应用商店。
删除未使用的体系结构:
选择项目,选择目标 → 项目名称 → 选择构建阶段 → 按“ +” → 新建运行脚本阶段 → 将该脚本命名为“删除未使用的体系结构脚本” 。
FRAMEWORK =“ TestFramework” FRAMEWORK_EXECUTABLE_PATH =“ $ {BUILT_PRODUCTS_DIR} / $ {FRAMEWORKS_FOLDER_PATH} / $ FRAMEWORK.framework / $ FRAMEWORK” EXTRACTED_ARCHS =()对于$ ARCHSdolipo中的ARCH-提取“ $ ARCH” $ FRAMEWORK_PATH -$ ARCH“ EXTRACTED_ARCHS + =(” $ FRAMEWORK_EXECUTABLE_PATH- $ ARCH“)donelipo -o” $ FRAMEWORK_EXECUTABLE_PATH-merged“-创建” $ {EXTRACTED_ARCHS [@]}“ rm” $ {EXTRACTED_ARCHS [@]}“
rm“ $ FRAMEWORK_EXECUTABLE_PATH”
mv“ $ FRAMEWORK_EXECUTABLE_PATH合并”“ $ FRAMEWORK_EXECUTABLE_PATH”
就这样 !!
仅当将应用程序推送到App Store时,此运行脚本才会删除未使用的Simulator体系结构。
现在,自定义iOS框架已完成,并且仍然通用。
请找到所附的示例工作项目https://github.com/charlieInDen/Universal-Framework
希望本文对希望创建自定义通用 iOS框架的人有用,请❤️向其他人推荐这篇文章😊。 让我知道您的反馈。 🙂
参考文献 :
- https://gist.github.com/cromandini/1a9c4aeab27ca84f5d79
- https://gist.github.com/steipete/bbea370b72bbc77a8040