语言: swift, 版本:swift4.2,XCode:10.2
写作时间:2019-07-02

Framework简介

有没有遇到这种场景:

  1. 同时维护过几个项目,发现一个项目有个bug,修复bug。其它项目也会有相应的问题,这个时候一般是git来cherry pick修复代码到其它项目。
  2. 一个二维码扫一扫的功能,项目一组的同学开发了,项目二组的同学过来说,这份代码也分享一份呗。然后就代码copy。

上面的场景的解决方案就是代码模块化modularize,java有jar包,Nodejs有packages,iOS就用framework。像Alamofire,Snapkit,Kingfisher。PodFile引入,pod update就能解决。这篇文章就是记录如何实现这个功能。

1. 下载demo工程

demo工程:https://github.com/zgpeace/KnobControl/tree/start
目录为Starter, 运行后效果如下:

这个项目里面主要有两个类Knob.swift负责圆圈的逻辑,ViewController.swift负责调用圆圈的逻辑,这里framework就是要复用Knob.swift这个类,把原来工程的类删掉。然后通过framework的方式引入进来,实现代码分享的功能。

创建framework

  1. StarterPrepare文件夹里面的项目是经过改进的项目可以直接运行。
  2. 创建framework。Xcode, 选择 File ▸ New ▸ Project….
    Choose iOS ▸ Framework & Library ▸ Cocoa Touch Framework.
  3. 选择下一步, 填写信息如下KnobControl,最后create选择StarterPrepare的根目录,和KnobShowcase文件夹在同一层级。
  4. 在KnobControl中copy来自KnobShowcase的文件 Knob.swiftKnobRender.swiftRotationGestureRecognizer.swift.
  5. 删除KnobShowcase的文件 Knob.swiftKnobRender.swiftRotationGestureRecognizer.swift.
  6. 集成Binary
    右键点击 KnobShowcase > Add Files to “KnobShowcase” > select KnobControl.xcodeproj > 增加 KnobControl.xcodeproj 作为 sub-project.
  7. build and run 发现错误
    虽然framework跟project在同一个room里面,还是需要在targets中建立连接。先看看KnobControl的目录结构,找到KnobControl.framework文件

    选择最上面KnobShowcase > the project editor > KnobShowcase target > General tab > Embedded Binaries section > 把 KnobControl.framework 拖到 KnobControl.xcodeproj Embedded Binaries. Linked Frameworks and Libraries也会同步加进来。

    运行发现还是有错误。
  8. 访问权限
    打开文件ViewController.swift, import头文件KnobControl.
import KnobControl

方法需要修改为public修饰,因为默认的方法修饰为Internal,是指同一个framework里面可见。
运行还是失败…

  1. 修改StoryBoard权限
    用到storyboards的时候, 关联的自定义classes,需要在Identity inspector中设置class name 和 module . storyboard创建的时候,Knob 是APP的module一部分, 现在它在framework中.

更新storyboard告诉它到哪里可以找到自定义的custom view:

Main.Storyboard > 选择 Knob in the Document outline >
Identity inspector > under Custom Class > 修改Module 为 KnobControl a
运行成功

创建本地pod

  1. 清除KnobShowcase中与KnobControl.xcodeproj的链接。
  2. 创建Pod,在Terminal中运行
pod spec create KnobControl

这句话创建了文件KnobControl.podspec

  1. 替换KnobControl.podspec 的内容
s.name         = "KnobControl"
s.version      = "1.0.0"
s.summary      = "A knob control like the UISlider, but in a circular form."
s.description  = "The knob control is a completely customizable widget that can be used in any iOS app. It also plays a little victory fanfare."
s.homepage     = "http://raywenderlich.com"
s.license      = "MIT"
s.platform     = :ios, "12.2"
s.source       = { :path => '.' }
s.source_files = "KnobControl"

在end之前加上swift版本的说明

s.swift_version = "4.2"
  1. 验证Podspec的正确性, 在Terminal中运行
pod spec lint

显示error,因为source是local的。所以目前不需要验证Podspec。

  1. 创建pod, 在Terminal中运行
pod init

运行后,就创建了Podfile文件

  1. Podfile文件内容修改如下:
platform :ios, '12.0'target 'KnobShowcase' douse_frameworks!pod 'KnobControl', :path => '../KnobControl'end# Workaround for Cocoapods issue #7606
post_install do |installer|installer.pods_project.build_configurations.each do |config|config.build_settings.delete('CODE_SIGNING_ALLOWED')config.build_settings.delete('CODE_SIGNING_REQUIRED')end
end
  1. 保存Podfile文件内容,Terminal中运行
 pod install

运行成功以后,创建了KnobShowcase.xcworkspace文件。
同时Terminal会有警告:

修复方法如下, 选择KnobShowcase根目录下打开项目KnobShowcase.xcodeproj > KnobShowcase target > Build Settings tab > search > ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES > 选择Other选项,在弹框里填入内容 $(inherited).

再次运行pod install , 警告消失了。

  1. 打开项目KnobShowcase.xcworkspace,查看发现有两个Targets

    Pods-KnobShowcase: pod project把其它pod和当前项目合并为最终结果的一个framework: Pods-KnobShowcase.
    KnobControl: pod 集成进来的三方库.
  2. 查看文件目录在Development Pods, 因为是local pod的原因。

pod仓库上传到git

  1. 创建git仓库
  2. 下载远程仓库
    创建目录
mkdir repo
cd repo

clone 仓库

git clone URL

显示clone成功

Cloning into 'KnobControl'...
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
  1. 接着,copy文件夹KnobControl的内容到repo/KnobControl.
    打开copy过来的KnobControl.podspec, 修改s.source的内容:
s.source       = { :git => "URL", :tag => "1.0.0" }
  1. 推送到远程仓库
cd KnobControl/
git add .
git commit -m "Initial commit"
git push -u origin master

  1. 给git仓库打tag

KnobControl.podspec

s.version      = "1.0.0"

打tag,并推送到git仓库

git tag 1.0.1
git push --tags
  1. 检查创建的spec
pod spec lint

结果是验证通过。

  1. 更新在KnobShowcase中的Podfile引入pod内容如下:
pod 'KnobControl', :git => 'URL', :tag => '1.0.0'
s.homepage     = 'URL'
  1. Terminal中更新三方库
pod update

运行项目成功。

发布pod到公网

平时用开源三方库很方便,类似如下:

pod ‘ZgpeaceKnobControl’, ‘1.0.1’

  1. 先注册为pod trunk用户
$ pod trunk register zgpeace@gmail.com 'zgpeace' --description='zgpeace macbook pro'

说明:

  • 邮箱:zgpeace@gmail.com, 提交后,会收到验证邮件,点击确认后即可注册成功,这里没有密码,类似于邮箱跟电脑的绑定了连接session token。
  • 用户名:zgpeace
  • 描述:zgpeace macbook pro
  1. 打开邮箱 > 点击确认的pod trunk链接 > 显示注册成功
  2. terminal 验证信息
% pod trunk me- Name:     zgpeace- Email:    zgpeace@gmail.com- Since:    July 2nd, 02:47- Pods:- ZgpeaceKnobControl- Sessions:- July 2nd, 02:47 - November 7th, 18:03. IP: *.*.*.* Description: 15 inch macbook pro-
  1. 发布pod到公网

如果用名字KnobControl,发现已经被注册了。

% pod trunk push ./KnobControl.podspec
Updating spec repo `master`CocoaPods 1.7.3 is available.
To update use: `sudo gem install cocoapods`Validating podspec-> KnobControl (1.0.1)- NOTE  | xcodebuild:  note: Using new build system- NOTE  | [iOS] xcodebuild:  note: Planning build- NOTE  | [iOS] xcodebuild:  note: Constructing build description[!] You (zgpeace@gmail.com) are not allowed to push new versions for this pod. The owners of this pod are dev.mjun@gmail.com.

实际上主要简单重命名podspec文件的名字,比如加个前缀(例子:ZgpeaceKnobControl), 并且把文件的s.name也改为相同的名字即可.

s.name         = "ZgpeaceKnobControl"

重新发布pod, 成功信息如下

% pod trunk push ./ZgpeaceKnobControl.podspec
Updating spec repo `master`
Validating podspec-> ZgpeaceKnobControl (1.0.1)- NOTE  | xcodebuild:  note: Using new build system- NOTE  | [iOS] xcodebuild:  note: Planning build- NOTE  | [iOS] xcodebuild:  note: Constructing build descriptionUpdating spec repo `master`--------------------------------------------------------------------------------?  Congrats?  ZgpeaceKnobControl (1.0.1) successfully published?  July 2nd, 02:57?  https://cocoapods.org/pods/ZgpeaceKnobControl?  Tell your friends!
--------------------------------------------------------------------------------
  1. 运用到项目
    修改Podfile的引入为
pod 'ZgpeaceKnobControl', '1.0.1'

导入三方库

pod update

成功后运行项目,跟原来一样。

7. 总结

Framework给iOS提供了代码共享的解决方案,本地创建Framework可以验证重用代码的可行性,Local Pod可以验证通过pod方式引入三方库,发布到git可以共享pod,pod trunk push可以在公网共享三方库。

创建依赖的Framework请参考 – 创建CocoaPods的Framework Swift组件化之路(下)

代码下载

demo 原始代码(StarterPrepare文件夹)、中间代码(Intermediate文件夹)、本地Pod结果代码(Final文件夹)、公网pod结果代码(FinalPodPush文件夹):
https://github.com/zgpeace/KnobControl/tree/start
pod 仓库:
https://github.com/zgpeace/KnobControl

参考

https://www.raywenderlich.com/5109-creating-a-framework-for-ios
https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WhatAreFrameworks.html
https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html#//apple_ref/doc/uid/10000123i
https://guides.cocoapods.org/making/getting-setup-with-trunk.html
https://guides.cocoapods.org/using/the-podfile.html

创建CocoaPods的Framework Swift组件化之路(上)相关推荐

  1. 百度App Objective-C/Swift 组件化混编之路(二)- 工程化

    作者丨张渝.郭金 来源丨百度App技术 前文<百度App Objective-C/Swift 组件化混编之路>已经介绍了百度App 引入 Swift 的影响面评估以及落地的实施步骤,本文主 ...

  2. swift 组件化_打造完备的iOS组件化方案:如何面向接口进行模块解耦?

    作者 | 黑超熊猫zuik,一个修行中的 iOS 开发,喜欢搞点别人没搞过的东西,钻研过逆向工程.VIPER 架构和组件化. 关于组件化的探讨已经有不少了,在之前的文章 iOS VIPER架构实践(三 ...

  3. android国籍组件,android组件化之路

    问题:实际业务变化快,而工程内各个功能模块耦合度太高,不能对功能模块进行快速方便地拆分或组装.团队共同开发中,可能一个文件同时被多人修改,导致每次更新提交代码都需要消耗大量时间去merge代码.每次修 ...

  4. 组件化之路 - ViewModel一知半解

    新的一年,优先把欠账补齐,关于Jetpack下Lifecycle.ViewModel.LiveData组件库,以及ViewModel+LiveData项目实践,如今也只差ViewModel还没有记录了 ...

  5. 蘑菇街App的组件化之路·续

    原文:http://limboy.me/ios/2016/03/14/mgj-components-continued.html 蘑菇街 App 的组件化之路·续 前几天在「移动学习分享群」分享了关于 ...

  6. swift 组件化_京东商城订单模块基于 Swift 的改造方案与实践

    ABI Stability & Module Stability 以及Swift优势 2019年Swift 5发布,标志这门语言迎来了一个重大的里程碑.与之前的版本相比除了一些基础语法的改变, ...

  7. 百度App Objective-C/Swift 组件化混编之路(一)

    作者丨郭金.陈佳 来源丨百度App技术 一. 背景 1.1 Swift 发展历史 2010 年 7 月,克里斯(Chris Lattner)开始设计 Swift.完成基础架构后,克里斯带领开发小组陆续 ...

  8. 【超强干货】蘑菇街App的组件化之路

    本文为『移动前线』群在3月10日的分享总结整理而成,转载请注明来自『移动开发前线』公众号. 嘉宾介绍 蘑菇街李忠(花名银时,网名 limboy),多年客户端开发经验,目前主要负责移动端基础架构设计及核 ...

  9. 蘑菇街 App 的组件化之路

    在组件化之前,蘑菇街 App 的代码都是在一个工程里开发的,在人比较少,业务发展不是很快的时候,这样是比较合适的,能一定程度地保证开发效率. 慢慢地代码量多了起来,开发人员也多了起来,业务发展也快了起 ...

  10. 百度App组件化之路

    原创:GuoJin 百度APP技术团队-资深技术专家 文章来源:百度APP技术微信公众号           组件化是一个老生常谈的涉及面很广的话题,即不是做好一件事而是做好一系列的事情才能达成:其中 ...

最新文章

  1. 计算机二级各个科目的作用,计算机二级考试的各个科目的内容及区别.doc
  2. java MD5 并发
  3. 前端学习(2050)vue之电商管理系统电商系统之实现node创建服务器
  4. 精品素材 – 24款扁平风格 PSD 格式图标免费下载
  5. python如何定义类_Python class定义类,Python类的定义(入门必读)
  6. qq 音乐 python 登录_手把手教你使用Python抓取QQ音乐数据(第四弹)
  7. BAT的医疗春秋大梦
  8. pytest测试框架学习笔记
  9. 阿里“小前台、大中台”的解读
  10. 5.3.2 jmeter组件-线程组:setUp线程组和tearDown线程组
  11. 易扩展,易复用,封装axios
  12. 请问如何使IE支持有swing的aaplet?
  13. 【转载】KAB春纳 | 一同乘风破浪吧
  14. 莫队和带修莫队 学习笔记
  15. SCQA结构化表达--提升沟通效果
  16. 【一、建站综述及步骤简介】2021最详细wordpress博客建站教程(2021.03.01更新)
  17. 这些书你看过了多少?
  18. Python也许很友好,但它也容易弄得一团槽
  19. 物流可视化平台/大屏看板/图表统计/运单跟踪/物流数据统计/物流看板/运单量统计/axure原型/大屏数据可视化/动效可视化数据大屏看板
  20. 来,带你看看京东“硬核”科技!

热门文章

  1. idea android模拟器无法启动,Flutter Hello world应用程序无法在Android模拟器x86_64上启动...
  2. 单纯学python能干啥_如何高效学习Python编程,转行的朋友可以过来看看,单纯的经验分享...
  3. [android]Tablayout使用setupWithViewPager
  4. Windows10下安装原生TensorFlow GPU版
  5. 关于SUSE linux
  6. 「陶哲軒實分析」 習題 3.5.1
  7. HMM学习笔记_2(从一个实例中学习HMM前向算法)
  8. 删除整个目录(API)
  9. 占空比输出程序c语言,怎样利用c语言来实现占空比的设置?(单片机:SPCE061A)
  10. 信创只是开始_一切只是开始!谁是下一个“第一创业”?