??榛?实现

前言

一、需要问题考虑:消息型的还是URL型的?配置化还是自注册?现有??楣δ芡晟贫懒??借用框架还是自行实现?数据传递链的设计?如何回调?……

二、最通用的??榛迪???榛鞫戎行?router),通过共享数据模型、协议降低??榧漶詈希骋籦lock回调、公用组件可直接引入使用,也可通过调度中心调用。

参考资料 https://www.yuque.com/ioser/spb08a/yi6ppl

模块架构设计目录说明

image

??榛迪执胧纠?/p>

调用

<pre data-language="plain" id="GffX9" class="ne-codeblock" style="border: 1px solid rgb(232, 232, 232); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-color: rgb(249, 249, 249); padding: 16px; font-size: 13px; color: rgb(89, 89, 89);"> SWMediaParam *param = [[SWMediaParam alloc] init];
param.type = SWMediaParamTypeOfVideo;
[SWUrlRouter openUrl:kSWMediaUrl withParam:param completion:^(NSError *error, id dic) {
NSLog(@"completed:%@",dic);
}];
</pre>

??榈鞫?/p>

<pre data-language="plain" id="cnbTL" class="ne-codeblock" style="border: 1px solid rgb(232, 232, 232); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-color: rgb(249, 249, 249); padding: 16px; font-size: 13px; color: rgb(89, 89, 89);">/// 注册路由
/// @param handlerClass ??槔?br> /// @param url 路由

  • (void)registHandlerClass:(Class<SWUrlHandlerProtocol>)handlerClass forUrl:(NSString *)url;

/// 调用路由实现??楣δ?br> /// @param url 路由
/// @param param 传入参数
/// @param callback ??榛氐?/p>

  • (void)openUrl:(NSString *)url withParam:(id)param completion:(SWUrlHandlerCallback)callback;
  • (BOOL)canOpenUrl:(NSString *)url;</pre>

??橥ㄑ?/p>

<pre data-language="plain" id="IgeM1" class="ne-codeblock" style="border: 1px solid rgb(232, 232, 232); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-color: rgb(249, 249, 249); padding: 16px; font-size: 13px; color: rgb(89, 89, 89);">///通讯协议

  • (void)handleUrl:(NSString *)url withParam:(id)param completion:(SWUrlHandlerCallback)callback;</pre>

路由定义

<pre data-language="plain" id="AGj4s" class="ne-codeblock" style="border: 1px solid rgb(232, 232, 232); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-color: rgb(249, 249, 249); padding: 16px; font-size: 13px; color: rgb(89, 89, 89);">static NSString *const kSWMediaUrl = @"SuperWomgs://Media";//音视频模块</pre>

创建一个???/h2>

现在我们知道了什么可以成为模块,让我们创建一个。则需要创建一个特定的依赖项,以表示我们应用程序的核心概念。我称它为Core。

首先,我创建一个动态框架项目。

导入???/h2>

创建依赖项后,我们可以将其包含到我们的应用程序中。对于这一部分,我首先创建了一个工作区,这使得一次处理两个项目变得更加容易。

我向工作区以及我的核心??樘砑恿艘桓鲇τ贸绦?。它们尚未链接。

为了在应用程序中导入Core框架并能够使用它,我只将框架文件拖放到主应用程序的部分中。Linked Framework and Libraries

??橐览倒芾?/h2>

处理依赖关系的另一个角度是创建一个伞形框架,以将每个依赖关系嵌入到一个程序包中,以限制构建并保持整洁的工作空间。 使用CocoaPods,已经做到了。

git管理

概念

1.code repository 代码仓库,主要存放我们提交的代码

2.spec repository 配置仓库,所有的配置按照包名、版本号存放在这个仓库。这个仓库只用来存放.podspec文件,不存放代码。

一、gitLab 创建 spec配置仓库 和代码 Code 仓库

创建配置仓库 管理所有???/p>

image

创建每个模块代码 Code 仓库

image

二、创建 pod 库

在本地文相应件夹 创建SWPublic模块 仓库名为SWPublic

执行以下命令要 可能要几分钟的时间才能完成

<pre data-language="plain" id="XAnlJ" class="ne-codeblock" style="border: 1px solid rgb(232, 232, 232); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-color: rgb(249, 249, 249); padding: 16px; font-size: 13px; color: rgb(89, 89, 89);">pod lib create SWPublic</pre>

完成创建后会有以下终端提示 配置 pod 库

<pre data-language="plain" id="QOlOh" class="ne-codeblock" style="border: 1px solid rgb(232, 232, 232); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-color: rgb(249, 249, 249); padding: 16px; font-size: 13px; color: rgb(89, 89, 89);"># 选择使用平台
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 ]

No

类的前缀

What is your class prefix?

GS</pre>

  • 所有的配置都配置完后,会自动打开我们当前的 pod 库。
  • image

pod 项目结构

系统会自动打开一个 Xcode 工程,具体的结构如下,XXX.podspec为我们的配置文件。

image

三、podspec 项目配置

<pre data-language="plain" id="hPmzN" class="ne-codeblock" style="border: 1px solid rgb(232, 232, 232); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-color: rgb(249, 249, 249); padding: 16px; font-size: 13px; color: rgb(89, 89, 89);">Pod::Spec.new do |s|
# pod search 搜索的关键字,不需要手动改变
s.name = 'SWPublic'

版本号,注意,需要和我们代码里的tag保持一致

s.version = '0.1.0'

简介

s.summary = '基础库'

详细描述

s.description = <<-DESC
基础库 一般存放通用的跨??榈拇?br> DESC

项目主页地址,必须是可以访问的地址

s.homepage = 'https://gz-gitlab.vipthink.cn/'

s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'

许可证

s.license = { :type => 'MIT', :file => 'LICENSE' }

作者

s.author = { 'Tony0822' => 'XXXXXX(会自动生成)' }

项目地址

s.source = { :git => 'https://gz-gitlab.vipthink.cn/fly/front/app/ios/swpublic.git', :tag => s.version.to_s }

s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

s.ios.deployment_target = '8.0'

源码文件的配置路径,所有的代码都在这个目录下

s.source_files = 'SWPublic/Classes/*/'

资源文件的配置路径

s.resource_bundles = {

'GSWebviewLib' => ['SWPublic/Assets/*.png']

}

源码头文件的配置路径

s.public_header_files = 'Pod/Classes/*/.h'

系统框架的依赖库

s.frameworks = 'UIKit', 'MapKit'

第三方框架的依赖库

s.dependency 'AFNetworking', '~> 2.3'

s.dependency 'YYKit'</pre>

验证

验证 podspec 文件,编辑完 podspec 文件需要验证一下这个文件是否可用 podspec 文件不允许有任何的 warning 或者 error

注意如果有多种依赖关系(如SWMediaPlayer??橐览盗俗约旱腟WPublic) 需要指定源

pod lib lint --sources=https://gz-gitlab.vipthink.cn/fly/front/app/ios/mudule-specs.git,'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'

<pre data-language="plain" id="RC8gV" class="ne-codeblock" style="border: 1px solid rgb(232, 232, 232); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-color: rgb(249, 249, 249); padding: 16px; font-size: 13px; color: rgb(89, 89, 89);">pod lib lint
--allow-warnings 允许有任何的Warning
--verbose 获取更多错误信息
--use-libraries 包含.a 需要添加此参数:</pre>

将??榇敕⒌酱娣糯肼肪?然后cd到Example文件 执行 pod install 检验是否拉到代码

image

pod 成功后 至此本地仓库已完成

四、提交代码到远端 关联仓库

将??榇胩峤坏皆冻滩挚?可能用到的 shell

<pre data-language="plain" id="L55fr" class="ne-codeblock" style="border: 1px solid rgb(232, 232, 232); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-color: rgb(249, 249, 249); padding: 16px; font-size: 13px; color: rgb(89, 89, 89);">git init//初始化
git status//查看状态
git add .//添加文件到缓冲区
git commit -m "描述"http://从缓冲区提交代码到仓库
git tag -a '0.0.1' -m '描述'//添加tag
git tag //查看tag
git tag -d '0.0.1'//删除tag
git remote add origin https://gz-gitlab.vipthink.cn/fly/front/app/ios/swpublic.git//关联本地仓库和远程仓库。
git push -f origin master//将本地库的代码推到远程库
git push --tags//将本地创建的tag推到远程库
git push origin :0.0.1//删除tag</pre>

遇到的问题

! [remote rejected] master -> master (pre-receive hook declined)

error: failed to push some refs to 'https://gz-gitlab.vipthink.cn/xchaos/ios/wdpublic.git'

项目配置修改 : 点击进入Protected branches,点击unprotected将master分支的权限改变,即关闭master的protected权限

参考: https://www.cnblogs.com/cppeterpan/p/7289266.html

临时解决方案 第一次推送成功后 protect 权限改回来防止他人修改

五、创建索引库

1.pod repo 查看本地索引库

image

查看是否已经有了所以需要的索引库

没有用以下指令创建 XXXSpec 对应我上面的所需要的SuperWings 名字可以自定义一般区分于项目名

pod repo add XXXSpec 远程索引库的gitlab的地址

创建完成之后可以用pod repo 查看是否成功 或者 ~/.cocoapods/repos查看是有有对应的文件夹

image

六、将代码提交到远程仓库后 执行 仓库配置关联

<pre data-language="plain" id="FOIdd" class="ne-codeblock" style="border: 1px solid rgb(232, 232, 232); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; background-color: rgb(249, 249, 249); padding: 16px; font-size: 13px; color: rgb(89, 89, 89);">pod repo push XXXSpec SWPublic.podspec --allow-warnings
注:XXXSpec 为创建索引库时的name,SWPublic.podspec为创建本地库时的name

例子:pod repo push SuperWings SWPublic.podspec --allow-warnings</pre>

执行完上述shell 会生成对应的版本管理

image

七、集成

image
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容