阅读 109

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复制代码

确认之后,系统会为你自动配置组件项目,创建好的项目如下

image.png

image.png这个 Example 已经为你的组件创建了索引文件 podspec,并且集成了该组件。

我们来看下 ExamplePodfile 的内容:

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 主目录下:

image.png

这个文件夹下,一个存放你的各种类文件,一个存放图片资源等。

1.2podspec 文件

在你回答之前问题之后,pod 为你自动创建了该文件,并执行了 pod install 命令,该命令会找到组件的索引文件(也在本地) MSDNetWorking.podspec:

image.png

#

# 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

image.png这样,我们就设置好了共享的内容,即组件开发好了。接下来,我们使用 Example 工程来使用这个组件的内容

终端进入 Example 工程目录下,执行 pod install 命令来安装组件。

image.png

我们发现,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 工具的另外一个优点就是,多个组件依赖同一个组件时,它会自动帮你检测安装,而不会重复导入。

image.png

我们发现 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,又或者是 GitHubCoding 等平台。

五.关联远程仓库

在模版 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复制代码

image.png

推送失败那就暴力推送覆盖吧(第一次仓库无任何代码)

git push -f origin master复制代码

image.png

回到 Gittee 刷新一下即可看到你的提交记录。

六.打 tag发送到远程仓库

我们已经成功的将本地仓库关联并推送到远程仓库,现在我们要发布一个可用的组件。

  • 首先我们要给当前项目打一个 tag 版本号,在 podspec 中:

s.version = '0.1.0'复制代码
  • 指定的版本号是 0.1.0,那么我们就同样打个 0.1.0tag:

git tag 0.1.0 // 打 tag $ git push --tags // 推送到远程复制代码
  • 刷新页面,项目的 release 选项中会出现刚刚打的版本。

image.png

image.png

七.发布到 CocoaPods

7.1.验证

由于我们创建的项目以及标签的版本号都是沿用了 podspec 文件中的信息,因此可以直接验证 podspec 文件信息是否可以通过验证,如果需要调整,调整之后最好同样先验证: 注意

podspec 文件的版本号一定要和 tag 保持一致。

pod spec lint复制代码

我使用这个给报错了

image.png

换了一种方法

pod lib lint MSDNetworking.podspec --allow-warnings --use-libraries

????完美!!!!!

image.png

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复制代码

image.png

收到邮件

image.png

去验证

image.png

这样就验证成功了

现在,就可以将 podspec 提交给 CocoaPods 了。这个文件将是别人搜索你的组件的索引。

pod trunk push MSDNetworking.podspec --allow-warnings复制代码

image.png

???????? 这样就上传成功了

7.3.搜索

上传完成之后,接可以通过 pod search MSDNetworking 搜索到自己的组件了

image.png

没搜到?????????

没搜到别慌 !

删除本地的搜索文件试试

rm ~/Library/Caches/CocoaPods/search_index.json复制代码

只执行了这行命令仍然搜不到

别慌!

1.更新本地pod库

pod repo update复制代码

问题出在这里 远程的索引库没找到

image.png

删除本地搜索索引文件

rm ~/Library/Caches/CocoaPods/search_index.json复制代码

重新建立搜索

pod search MSDNetworking复制代码

image.png

???????????? 完美搜到了!

八.集成到宿主工程

我们已经完成了网络组件的创建和发布,也支持了 CocoaPods 的集成。现在我们需要将该组件集成到宿主工程中去,这部分没什么好提的,因为使用方式和集成三方库是一样的,可以说三方库只不过是他人编写的功能组件而已,我们的组件同样可以提供给小组成员使用,相比于纯粹的三方库,我们的许多组件都关联了业务部分,或者基于私人的其他组件,因此适用范围较小。


作者:PolarBear
链接:https://juejin.cn/post/7054454008005525534


文章分类
IOS
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐