在Swift中创建一个私有iOS框架并使用CocoaPods分发它
框架是代码和资源的集合,用于封装在多个项目中有价值的功能。
一个swift框架包括一个Swift模块文件和一个共享库,其中Swift文件文件传达了框架API的源级别信息,共享库提供了在运行时加载的已编译实现。
有多种发布iOS框架的方法。 可以通过将其推送到任何git仓库管理器(例如github,gitlab等)来分发它。 在这里,您可以将整个框架项目推送到远程仓库,并使您的源代码可见,或者您可以在不共享源代码的情况下推送您的iOS框架。
在本文中,我们将学习如何快速创建一个私有框架,并在不共享其源代码的情况下使用CocoaPods分发它。
让我们从创建框架开始。
创建一个Swift框架
在这里,我们将创建一个HelloWorld框架,其中包含一个Logger类,该类又具有一个func类printHelloWorld ,该类将打印“ Hello World!”文本。
开启Xcode
从顶部菜单中选择Cocoa Touch Framework ,然后单击下一步。
将产品名称设置为HelloWorld并选择语言为Swift。
单击下一步并创建。
如果在项目中展开HelloWorld文件夹,则会找到两个文件: Info.plist和HelloWorld.h-后者是用于在框架和主机应用程序之间进行通信的头文件。
单击文件 → 新建 → 文件
选择“ 可可接触类” ,然后单击“ 下一步”。
将类名称设置为Logger并确保它是NSObject的子类。
单击下一步并创建。
现在Logger类将如下所示
类记录器:NSObject {
}
用以下代码行替换Logger类。
@objc公共类记录器:NSObject {
@objc公共类func printHelloWorld(){
打印(“ Hello World!”)
}
}
Logger是一个公共类,其中包含printHelloWorld函数,该函数打印“ Hello World!Hello World! ”文字。
添加了公共说明符,以便主机应用程序可以访问Logger类和printHelloWorld函数。
@objc→这告诉编译器可以从Objective-C访问这段Swift代码,如果主机应用程序是用Objective-C编写的,则很有用。
生成通用框架
要制作可在设备和模拟器上使用的通用框架,您可以配置一个归档后脚本,该脚本将在存档后为iOS模拟器构建框架,并将模拟器和iOS二进制文件合并为一个胖通用框架。
请按照以下步骤生成通用框架。
- 转到构建设置->体系结构->将仅构建活动体系结构设置为否。
- 在iPhone 5和iphone 6或更高版本的模拟器中构建框架,以确保您的框架同时支持i386和x86_64体系结构。
- 要使Xcode在自动存档后运行脚本,请选择HelloWorld目标,单击“ 产品”->“方案”->“编辑方案” (或Cmd + Shift + <),然后为“ 存档”命令配置“运行脚本”后处理:
- 复制以下运行脚本,并将其粘贴到“运行脚本”窗口中。
UNIVERSAL_OUTPUTFOLDER = $ {BUILD_DIR} / $ {CONFIGURATION}-通用
#确保输出目录存在
mkdir -p“ $ {UNIVERSAL_OUTPUTFOLDER}”
#接下来,计算出我们是否在SIM卡或DEVICE中
xcodebuild -target“ $ {PROJECT_NAME}”-配置$ {CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH = NO BUILD_DIR =“ $ {BUILD_DIR}” BUILD_ROOT =“ $ {BUILD_ROOT}”干净的构建
xcodebuild -target“ $ {PROJECT_NAME}” ONLY_ACTIVE_ARCH = NO-配置$ {CONFIGURATION} -sdk iphoneos BUILD_DIR =“ $ {BUILD_DIR}” BUILD_ROOT =“ $ {BUILD_ROOT}”干净的构建
#步骤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}”
科幻
- 确保为“从以下版本提供构建设置”设置选择HelloWorld ,然后单击“ 关闭”以应用更改。
- 最后,通过单击菜单栏中的产品 –>存档来存档框架。 如果该选项显示为灰色,请确保选择一个物理iOS设备,而不是iOS模拟器。
- 查找器应打开其中包含通用
HelloWorld.framework
项目目录。
右键单击它,然后选择“ 显示原始文件” ,您将在其中找到所需的通用框架,然后将其复制并粘贴到某个文件夹中。
有了通用框架,您就可以在主机应用程序中使用它了。
在主机应用中进行测试
- 打开您要在其中集成HelloWorld框架的主机应用程序, 或者在没有现有应用程序的情况下创建一个新的xcode项目。
- 转到项目( 主机应用程序 )检查器的“ 常规”选项卡,然后向下滚动到显示“ 嵌入式二进制文件”的位置 。 单击+按钮,然后单击添加其他 。 Finder窗口将下拉,在这里您需要选择HelloWorld.framework 。
注意:如果主机应用是用Objective C编写的,请进入Build Settings(构建设置) →在顶部,选择All and Combined(所有并合并) →在Build Options ( 构建选项)下 ,将Always Embed Swift Standard Libraries始终嵌入Swift标准库设置为Yes 。
导入框架
导入HelloWorld // Swift
@import HelloWorld; // 目标C
在viewController文件的顶部(如果主机应用程序是用Objective C编写的,则为viewController.m文件)的顶部添加import语句。
您应该能够访问该框架的Logger类和printHelloWorld函数。
Logger.printHelloWorld()。
您已经成功创建并集成了Swift Universal Framework! ✌️
使用Cocoa Pod分发Swift框架。
现在,您已经创建了框架,您希望它是私有的,并希望将其分发给组织内的其他开发人员。
创建一个私有存储库
- 如果您还没有帐号,请在https://gitlab.com中创建一个帐号。
- 创建一个新的私人仓库,并将其命名为HelloWorld。
- 将MIT许可证添加到您的项目。
注意:您还可以在其他任何基于Web的Git存储库管理器(如github,bitbucket等)中创建私有存储库。
安装CocoaPods
显然,要创建一个Pod,您需要安装CocoaPods。
遵循《 CocoaPods安装指南》来安装CocoaPods。
创建一个Pod Spec文件
创建一个新文件夹,并将其命名为“ 远程”(在您的桌面(或所需位置)中)。
打开终端并使用cd
切换到“远程”文件夹。
运行以下命令:
git clone https://gitlab.com/YOUR_USERNAME/HelloWorld.git (指向您的git存储库的网址)
这将克隆HelloWorld存储库,使用cd
切换到Remote文件夹中的HelloWorld存储库。
现在,将二进制文件HelloWorld.framework复制粘贴到HelloWorld存储库中。
运行以下命令:
pod spec创建HelloWorld
这将在当前文件夹中创建文件HelloWorld.podspec 。 它是一个模板,描述了吊舱及其建造方式。 在文本编辑器中打开它。
用以下内容替换podspec文件的内容。
#
#确保运行`pod spec lint HelloWorld.podspec'以确保这是一个
#有效的规范,并在提交规范之前删除所有包括此在内的评论。
#
#要了解有关Podspec属性的更多信息,请参见http://docs.cocoapods.org/specification.html
#要在CocoaPods回购中查看工作Podspecs,请参阅https://github.com/CocoaPods/Specs/
#
Pod :: Spec.new do | s |
#――― Spec Metadata ―――――――――――――――――――――――――――― ――――――――――――――#
#
#这些将帮助人们找到您的图书馆,同时
#感觉像是在做杂事,这绝对对您有利。 的
#summary应该为tweet-length,描述应更深入。
#
s.name =“ HelloWorld”
#s.version =“ INITIAL_VERSION OR TAG”
s.version =“ 1.0.0”
s.summary =“ HelloWorld是一个框架”
s.homepage =“ https://gitlab.com/YOUR_USER_NAME”
s.description =“ HelloWorld是一个具有记录器类和printHelloWorld函数的快速框架”
s.license =“ MIT”
s.author = {“ YOUR_NAME” =>“ YOUR_MAIL_ID”}
s.platform =:ios,“ 10.0”
s.ios.vendored_frameworks ='HelloWorld.framework'
#s.swift_version =“框架的快速版本”
s.swift_version =“ 4.1”
s.source = {:git =>“ https://gitlab.com/YOUR_USERNAME/HelloWorld.git”,:tag =>“#{s.version}”}
s.exclude_files =“类/排除”
结束
现在回到Termial并运行以下命令
豆荚皮棉
这会在本地验证您的库和podspec配置,如果podspec文件中的所有内容都正确,则应该收到以下消息。
HelloWorld通过了验证。
行!
现在,您需要将HelloWorld二进制框架和podspec文件推送到gitlab存储库中。
一对一运行以下命令。
//添加HelloWorld.framework和HelloWorld.podspec
git添加-A
//通过提交msg提交更改
git commit -m“添加框架和podspec文件”
//将更改推送到远程
git push -u起源
//创建一个标签,该版本应与您在podspec文件中提到的版本匹配
git标签1.0.0
//将标签推送到遥控器
git push-标签
接下来,在终端中运行以下命令来测试您的podspec验证
豆荚皮棉
如果podspec文件中的所有配置正确,您将获得成功的消息。
HelloWorld.podspec通过了验证。
太棒了!👌您距离通过CocoaPods在主机应用程序中测试框架仅一步之遥!
注意:向您要与其共享框架的所有成员授予访问Gitlab存储库的权限。
使用CocoaPods进行测试
创建一个全新的xcode项目并将其命名为Sample 。
打开终端并使用cd
切换到新项目目录。
通过运行以下命令初始化pod
荚初始化
这将创建pod文件。
在use_frameworks下面添加以下行! 在您的pod文件中。
pod'HelloWorld',:git =>“ https://gitlab.com/YOUR_USERNAME/HelloWorld.git ” //指向您的HelloWorld存储库的网址
保存它,然后通过运行以下命令来安装Pod。
吊舱安装
这将从Gitlab存储库中提取HelloWorld框架。
最后,它创建一个Sample.xcworkspace文件。
关闭HelloWorld和新的示例应用程序项目(如果已打开),然后打开新示例项目的Sample.xcworkspace 。
请按照前面的步骤导入HelloWorld框架,并在Sample应用程序中使用Logger类和printHelloWorld函数。
而已! 您已经成功地迅速创建了一个通用框架,并且能够使用可可豆荚进行分发。
希望本文对希望快速创建通用框架并使用可可豆分发的初学者有用! 😊
让我知道您的反馈。