iOS组件化(一)组件的创建
一.组件的创建
1.拉取模版
我们将创建在桌面上的一个名为 Demo
文件夹中。通过终端进入到该文件夹下,然后输入命令:
pod lib create MSDNetworking复制代码
// 作用的平台 What platform do you want to use?? [ iOS / macOS ] > iOS // 语言环境 What language do you want to use?? [ Swift / ObjC ] > ObjC // 是否需要一个 demo 用来测试组件 Would you like to include a demo application with your library? [ Yes / No ] > Yes Which testing frameworks will you use? [ Specta / Kiwi / None ] > None Would you like to do view based testing? [ Yes / No ] > Yes // 组件中,文件的前缀 What is your class prefix? > MSD复制代码
确认之后,系统会为你自动配置组件项目,创建好的项目如下
这个
Example
已经为你的组件创建了索引文件 podspec
,并且集成了该组件。
我们来看下 Example
的 Podfile
的内容:
use_frameworks! platform :ios, '9.0' target 'MSDNetWorking_Example' do pod 'MSDNetWorking', :path => '../' target 'MSDNetWorking_Tests' do inherit! :search_paths pod 'FBSnapshotTestCase' end end复制代码
其中为你集成了一个测试用例 pod 'FBSnapshotTestCase'
,目前可以忽略
我们可以看到: pod 'MSDNetWorking', :path => '../'
这一句,path
路径指向了本地路径,对应 MSDNetWorking 主目录下:
这个文件夹下,一个存放你的各种类文件,一个存放图片资源等。
1.2podspec 文件
在你回答之前问题之后,pod 为你自动创建了该文件,并执行了 pod install
命令,该命令会找到组件的索引文件(也在本地) MSDNetWorking.podspec:
# # Be sure to run `pod lib lint MSDNetWorking.podspec' to ensure this is a # valid spec before submitting. # # Any lines starting with a # are optional, but their use is encouraged # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html # Pod::Spec.new do |s| s.name = 'MSDNetWorking' #组件工程名 s.version = '0.1.0' #组件版本号 s.summary = 'A short description of MSDNetWorking.' #对组件的描述 # This description is used to generate tags and improve search results. # * Think: What does it do? Why did you write it? What is the focus? # * Try to keep it short, snappy and to the point. # * Write the description between the DESC delimiters below. # * Finally, don't worry about the indent, CocoaPods strips it! s.description = <<-DESC TODO: Add long description of the pod here. DESC #远程仓库地址 s.homepage = 'https://github.com/MaShudong/MSDNetWorking' # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { 'MaShudong' => 'first_msdong@163.com' } s.source = { :git => 'https://github.com/MaShudong/MSDNetWorking.git', :tag => s.version.to_s } # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' s.ios.deployment_target = '9.0' s.source_files = 'MSDNetWorking/Classes/**/*' # s.resource_bundles = { # 'MSDNetWorking' => ['MSDNetWorking/Assets/*.png'] # } # s.public_header_files = 'Pod/Classes/**/*.h' # s.frameworks = 'UIKit', 'MapKit' # s.dependency 'AFNetworking', '~> 2.3' #s.dependency是该组件所需要依赖的其他组件、三方组件等。 end复制代码
该文件为你的组件自动配置了一些基本的信息,当然这些信息是需要你根据情况修改的,更多的配置你可以搜索相关文档。
> 注意:这里的 Git 地址目前是找不到的,后期需要自己关联。
二.设置共享文件
podspec
文件中 s.source_files = 'MSDNetworking/Classes/**/*'
指代共享的资源路径,我们需要将共享的文件放到这里来。
我们打开组件的目录查看,可以看到这里已经有了名为 ReplaceMe
的文件了,这暗示你用共享文件替换它。
podspec
文件中还有一个被注释掉的:
# s.resource_bundles = { # 'MSDNetworking' => ['MSDNetworking/Assets/*.png'] # }复制代码
我们来创建一个 MSDNetworking 类:
@interface MSDNetworking : NSObject -(NSString*)getSomething; @end @implementation MSDNetworking -(NSString *)getSomething{ return @"test method."; } @end复制代码
将其移动到组件的共享目录下并删除掉空文件ReplaceMe
:
这样,我们就设置好了共享的内容,即组件开发好了。接下来,我们使用
Example
工程来使用这个组件的内容
终端进入 Example
工程目录下,执行 pod install
命令来安装组件。
我们发现,Example
项目中 Pods/Development Pods/MSDNetworking
下,多出来最新添加的文件
三.使用组件
我们安装好组件之后来使用一下组件的功能,就像使用三方库那样:
#import "MSDViewController.h" #import "MSDNetworking.h" **@interface** MSDViewController () **@end** **@implementation** MSDViewController - (**void**)viewDidLoad { [**super** viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (**void**)didReceiveMemoryWarning { [**super** didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (**void**)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { MSDNetworking * working = [[MSDNetworking alloc] init]; NSLog(@"%@",[working gerSomething]); }复制代码
控制台输出:
**2022-01-10 15:03:44.293512+0800 MSDNetworking_Example[2879:175584] test something**复制代码
这表示功能正常。
在组件开发过程中,使用 pod 'MSDNetworking', :path => '../'
将路径指向本地是很有必要的,方便测试你的组件配置是否正确,功能是否完善,相比推到远程、发布再集成,这方便太多了。
四.三方依赖库
有时候,我们的组件还依赖其他的组件,又或者是三方库。我们通过 s.dependency
字段去设置,多个库可以分开写多次。
Analyzing dependencies Fetching podspec for `MSDNetworking` from `../` Downloading dependencies Installing AFNetworking (3.4.0) ……复制代码
我们发现,Example
自动拉取了组件 MSDNetworking 所依赖的其他组件。CocoaPods
工具的另外一个优点就是,多个组件依赖同一个组件时,它会自动帮你检测安装,而不会重复导入。
我们发现 Example
工程的 Pods
中,本地开发的组件和远程发布的组件被分别放在了不同的目录下。
有了 AFNetworking
之后,你就可以修改你的网络请求组件了
#import "MSDNetworking.h" **@implementation** MSDNetworking - (NSString *)gerSomething{ **return** @"test something"; } #pragma mark **- GET请求,请求头不带参数的** -(**void**)GET:(NSString *)URLString parameters:(NSDictionary *)parameters success:(Success)success failure:(Failure)failure{ AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain",@"text/html",@"application/json", **nil**]; [manager GET:URLString parameters:parameters headers:parameters progress:^(NSProgress * **_Nonnull** downloadProgress) { } success:^(NSURLSessionDataTask * **_Nonnull** task, **id** **_Nullable** responseObject) { ; } failure:^(NSURLSessionDataTask * **_Nullable** task, NSError * **_Nonnull** error) { }]; } @end复制代码
修改好之后,还不能直接在 Example
中使用,需要卸载组件再重新安装。注释掉 pod 'MSDNetworking', :path => '../'
之后执行 pod install
即可完成卸载。
至此,就完成了组件的创建、文件共享、本地化测试使用和更新。但是,我们的组件毕竟是要服务于宿主工程的,如果仅仅只能是通过本地集成,那意义不大,我们要将其关联到远程服务器,推送到本地搭建的 gitee
,又或者是 GitHub
、Coding
等平台。
五.关联远程仓库
在模版 podspec
文件中,已经帮我们指定了一个 gitee
的仓库地址(个大平台自己创建,创建过程就不描述了)
你可以使用它或者进行修改它。我们这里选择使用它,先去 gitee
创建对应的仓库。
在最初创建组件时,系统已经帮我们创建好了本地 Git 仓库
可以通过
ls -la //进行查看复制代码
如果没有,你可以使用命令 git init
创建一个。
现在,我们要将之前的修改进行提交(本地提交)。
git commit -am "第一次提交"复制代码
添加关联远程仓库
git remote add origin https://gitee.com/********/msdnetworking.git复制代码
将本地内容推送到远程仓库
git push -u origin master复制代码
推送失败那就暴力推送覆盖吧(第一次仓库无任何代码)
git push -f origin master复制代码
回到 Gittee
刷新一下即可看到你的提交记录。
六.打 tag
发送到远程仓库
我们已经成功的将本地仓库关联并推送到远程仓库,现在我们要发布一个可用的组件。
首先我们要给当前项目打一个
tag
版本号,在podspec
中:
s.version = '0.1.0'复制代码
指定的版本号是
0.1.0
,那么我们就同样打个0.1.0
的tag
:
git tag 0.1.0 // 打 tag $ git push --tags // 推送到远程复制代码
刷新页面,项目的
release
选项中会出现刚刚打的版本。
七.发布到 CocoaPods
7.1.验证
由于我们创建的项目以及标签的版本号都是沿用了 podspec
文件中的信息,因此可以直接验证 podspec
文件信息是否可以通过验证,如果需要调整,调整之后最好同样先验证:
注意
podspec
文件的版本号一定要和 tag
保持一致。
pod spec lint复制代码
我使用这个给报错了
换了一种方法
pod lib lint MSDNetworking.podspec --allow-warnings --use-libraries
????完美!!!!!
7.2.发布
现在可以将 podspec
文件提交到 CocoaPods
上了:
首先要通过 trunk
注册生成一条会话:
// pod trunk register 邮箱 用户名 描述 pod trunk register first_msdong@163.com XIAOMAGE1105 --description=NETWORKINGDEMON [!] Please verify the session by clicking the link in the verification email that has been sent to first_msdong@163.com复制代码
收到邮件
去验证
这样就验证成功了
现在,就可以将 podspec
提交给 CocoaPods
了。这个文件将是别人搜索你的组件的索引。
pod trunk push MSDNetworking.podspec --allow-warnings复制代码
???????? 这样就上传成功了
7.3.搜索
上传完成之后,接可以通过 pod search MSDNetworking
搜索到自己的组件了
没搜到?????????
没搜到别慌 !
删除本地的搜索文件试试
rm ~/Library/Caches/CocoaPods/search_index.json复制代码
只执行了这行命令仍然搜不到
别慌!
1.更新本地pod库
pod repo update复制代码
问题出在这里 远程的索引库没找到
删除本地搜索索引文件
rm ~/Library/Caches/CocoaPods/search_index.json复制代码
重新建立搜索
pod search MSDNetworking复制代码
???????????? 完美搜到了!
八.集成到宿主工程
我们已经完成了网络组件的创建和发布,也支持了 CocoaPods
的集成。现在我们需要将该组件集成到宿主工程中去,这部分没什么好提的,因为使用方式和集成三方库是一样的,可以说三方库只不过是他人编写的功能组件而已,我们的组件同样可以提供给小组成员使用,相比于纯粹的三方库,我们的许多组件都关联了业务部分,或者基于私人的其他组件,因此适用范围较小。
作者:PolarBear
链接:https://juejin.cn/post/7054454008005525534