iOS 模块化进阶整理记录(中)

简介: iOS 模块化进阶整理记录(中)

什么是业务组件和弱业务组件?


业务组件里面基本都有:storyboard、nib、图片等等。弱业务组件里面一般没有。这不是绝对的,但一般情况是这样。 业务组件一般都是App上某一具体业务。比如首页、我、直播、行情详情、XX交易大盘、YY交易大盘、XX交易中盘、资讯、发现等等。而弱业务组件是给这些业务组件提供功能的,一般自己不直接表现在App上展示。


代码截取:


@implementation PBBasicProviderModule
YTXMODULE_EXTERN()
{
}
+ (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions
{
  [self setupThirdParty:application didFinishLaunchingWithOptions:launchOptions];
  [self setupBasic:application didFinishLaunchingWithOptions:launchOptions];
  return YES;
}
+ (void) setupThirdParty:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
  [self setupEaseMob:application didFinishLaunchingWithOptions:launchOptions];
  [self setupTalkingData];
  [self setupAdTalkingData];
  [self setupShareSDK];
  [self setupJSPatch];
  [self setupUmeng];
// [self setupAdhoc];
  });
}
+ (void) setupBasic:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [self registerBasic];
  [self autoIncrementOpenAppCount];
  [self setupScreenShowManager];
  [self setupYTXAnalytics];
  [self setupRemoteHook];
}
+ (YTXAnalytics) sharedYTXAnalytics
{
  return ......;
}
......

《iOS App组件化开发实践》介绍的层级结构设计图:


image.png


《iOS App组件化开发实践》推行的组件化规范:


  • 业务组件之间不能有依赖关系。
  • 按照图示不能跨层依赖。
  • 所谓弱业务组件就是包含着少部分业务,并且可以在这个App内的各个业务组件之间重用的代码。
  • 要依赖YTXModule的组件一定要以Module结尾,而且它一定是个业务组件或是弱业务组件。
  • 弱业务组件以App代号开头(比如PB),以Module结尾。例:PBBasicProviderModule。
  • 业务组件以App代号开头(比如PB)BusinessModule结尾。例:PBHomePageBusinessModule。
  • 业务组件之间不能有依赖关系,这是公认的的原则。否则就失去了组件化开发的核心价值。


由于引入PBBasicProviderModule解决AppDelegate中的各种问题,会导致PBBasicProviderModule体量激增,以下是《iOS App组件化开发实践》中的解决方案。

据说美团的组件化开发必须依赖主App的AppDelegate的一大堆设置和初始化。所以干脆他们就直接在主App中集成调试,他们通过二进制化和去Pod依赖化的方式让主App的构建非常快。


所以我们是不是可以继续污染这个PBBasicProviderModule。不需要在主App项目里的AppDelegate写任何初始化代码?基本或者尽量不在主App里写任何代码?改依赖主App变为依赖这个弱业务组件?


按照这个思路我们搬空了AppDelegate里的所有代码。比如一些初始化App样式的东西、初始化RootViewController等等这些都可以搬到一个新的弱业务组件里。


而业务组件其实根本不需关心这个弱业务组件,开发人员只需要在业务组件中的Example App中的AppDelegate中初始化自己业务组件的RootViewController就好了。


其他的事情交给这个新的弱业务组件就好了。而主App和Example App只要在Podfile中依赖它就好了。


所以最后的设想就是:开发者不会去改主App项目,也不需要知道主App项目。对于开发者来说,主App和业务组件之间是隔绝的。

上面这些表示一脸懵逼,来源下面有地址,大家自行理解。


坑点之 Debug/Release:


在对二进制Pod库跑测试的发现,源码能过,二进制(.a)不能过。 问题源头(这是二进制化的锅):


#ifdef DEBUG
#endif

由于DEBUG在编译阶段就已经决定了。二进制化的时候已经编译完成了。

解决方案:


创建了一个 PBEnvironmentProvider 大家都去依赖它。


然后原来判断宏的代码改成这样:


if([PBEnvironmentProvider testing])
{
//...
}

在主App的AppDelegate中这样:

#if DEBUG && TESTING
//PBEnvironmentProvider提供的宏
CONFIG_ENVIRONMENT_TESTING
#endif


原理是: 如果AppDelegate有某个方法(CONFIG_ENVIRONMENT_TESTING宏会提供这个方法),[PBEnvironmentProvider testing]得到的结果就是YES。


业务组件间通信


App路由能解决哪些问题:


image.png


1)3D-Touch功能或者点击推送消息,要求外部跳转到App内部一个很深层次的一个界面。


2)自家的一系列App之间如何相互跳转?


3)如何解除App组件之间和App页面之间的耦合性?


4)如何能统一iOS和Android两端的页面跳转逻辑?甚至如何能统一三端的请求资源的方式?


5)如果使用了动态下发配置文件来配置App的跳转逻辑,那么如果做到iOS和Android两边只要共用一套配置文件?


6)如果App出现bug了,如何不用JSPatch,就能做到简单的热修复功能?


7)如何在每个组件间调用和页面跳转时都进行埋点统计?每个跳转的地方都手写代码埋点?利用Runtime AOP ?


8)如何在每个组件间调用的过程中,加入调用的逻辑检查,令牌机制,配合灰度进行风控逻辑?


9)如何在App任何界面都可以调用同一个界面或者同一个组件?只能在AppDelegate里面注册单例来实现?


App之间跳转实现

1)URL Scheme方式 2)Universal Links方式


组件间通信的三方库支持也有许多如:

关于JLRoutes简单介绍:《iOS 模块化之 JLRoute 路由示例 (中英文)》(https://github.com/ReverseScale/JLRouteDemo


目录
相关文章
|
8月前
|
Android开发 iOS开发
iOS 逆向编程(四)实操 Jailbreak 进阶必备软件
iOS 逆向编程(四)实操 Jailbreak 进阶必备软件
55 0
|
9月前
|
缓存 JavaScript iOS开发
iOS 逆向编程(十五)Cycript 语法进阶(封装 .cy 脚本文件)
iOS 逆向编程(十五)Cycript 语法进阶(封装 .cy 脚本文件)
123 0
|
9月前
|
Android开发 iOS开发
iOS 逆向编程(四)实操越狱进阶必备软件
iOS 逆向编程(四)实操越狱进阶必备软件
81 0
|
存储 前端开发 测试技术
iOS 模块化进阶整理记录(下)
iOS 模块化进阶整理记录(下)
152 0
iOS 模块化进阶整理记录(下)
|
存储 前端开发 中间件
iOS 模块化进阶整理记录(上)
iOS 模块化进阶整理记录(上)
412 0
iOS 模块化进阶整理记录(上)
|
算法 API 开发者
想要进阶却不知道从何下手,iOS开发者福利来了
从09年iOS开发出来,到现在!这个当时丰盛一时的开发语言,现在似乎已经开始走下坡路了!一批人离开了,但是还有一群人选择留在这里,那这篇总结,希望能够帮助到还留在这个行业的伟大的开发者们~ 中高级进阶,这是现在这个市场讨论的最多的一个话题,长时间的开发经验总结,现在占据iOS中级开发层面的程序员应.
1128 0
|
2月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
106 3
|
4月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
123 2
|
2月前
|
API 开发工具 Android开发
iOS 和 Android 平台的开发有哪些主要区别?
iOS与Android开发区别:iOS用Objective-C/Swift,App Store唯一下载渠道;Android用Java/Kotlin,多商店发布(如Google Play、华为市场)。设计上,iOS简洁一致,Android灵活可定制。开发工具,iOS用Xcode,Android用Android Studio。硬件和系统多样性,iOS统一,Android复杂。权限管理、审核流程及API各有特点,开发者需依据目标平台特性进行选择。
38 3
|
12天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比