在Xcode 10.2和iOS 12中编写自定义通用框架

作为开发人员,我们希望尽可能多地编写可重用的代码集,以便以后可以将这些组件与多个应用程序一起使用,并使生活变得轻松。

注意 :有关iOS面试问题,请查看此链接—您必须在2018年准备的iOS面试主要问题

框架是模块化的和可重用的代码集,用作高级软件的组成部分。 框架具有三个主要目的:

  • 代码封装
  • 代码模块化
  • 代码重用

使用框架的最好理由是它们可以被构建一次,并且可以无限制地重复使用!

入门

让我们从创建自定义框架开始,使其通用,以便可以在模拟器以及设备上使用它。

让我们打开Xcode并创建一个新项目。 选择iOS选项卡,向下滚动到Framework & Library然后选择Cocoa Touch Framework

  1. 为您的框架项目选择一个模板

2.输入产品名称并填写其他详细信息

填写完所有详细信息并按下一步后,您的项目就可以按以下所示进行构建了–

如果您构建项目,则它将生成TestFramework.framework作为产品,该产品将根据开发人员选择的选项支持模拟器或设备。

您当前的状态是一个没有代码的框架,这和没有糖的纯巧克力一样吸引人。 在框架中添加逻辑或功能,然后尝试构建它。 我们专注于创建通用框架,因此编写代码和资源部分留给开发人员去探索更多或等待另一部分。

现在是时候学习了,如何使自定义框架成为可在模拟器和设备上使用的通用框架。

3.创建新方案,选择项目目标→新建模式

请输入新的架构名称-ProjectNameUniversal

现在是时候使用这种模式来创建通用框架了。 我写了一个“运行脚本”来生成通用框架。

选择项目目标编辑模式存档后操作按“ +” →“ 新建运行脚本操作”

然后复制粘贴下面的脚本代码。

  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框架的人有用,请❤️向其他人推荐这篇文章😊。 让我知道您的反馈。 🙂

参考文献

  1. https://gist.github.com/cromandini/1a9c4aeab27ca84f5d79
  2. https://gist.github.com/steipete/bbea370b72bbc77a8040