AppDelegateModule 组件主要负责实现 hook AppDelegate
页面容器、第三方SDK初始化等工作需要在启动时完成,我们通过 hook AppDelegate,将入口所做的工作交给一个组件完成,在该组件中注册其它需要在启动时调用 AppDelegate 方法的组件,让每个组件都可以拥有一类似 didFinishLaunchingWithOptions 方法。
DJMainModule 组件为整个业务启动的入口
将需要调用 appdelegate 方法的组件,在 MainModule 中注册;
这里的 modules 是个数组,可解决调用 delegate 方法的顺序问题。
+ (void) load {
// 注册组件
// NSArray *modules = @[@“MainModule”, @“需要调用的组件”];
NSArray *modules = @[@"DJOldSchoolModule"];
NSString *url = @"router://AppDelegateModule/setDidFinishLaunchingModules";
[JDRouter openURL:url arg:modules error:nil completion:nil];
// 执行AppDelegateModule的run
NSString *urlrun = @"router://AppDelegateModule/run";
[JDRouter openURL:urlrun arg:nil error:nil completion:nil];
}
DJOldSchoolModule 组件,中转模块
1)监听AppDelegateModule生命命周期并实现相应方法,并间接调用launchModule;
2)封装跳转协议router://DJOldSchoolModule/jumpAgreement,统一跳转逻辑;
3)接受外部通知调起等事件的协议解析、转发工作;
4)App资源的统一处理等。
launchModule组件为开屏页、rootTabController等处理
在 launchModule 中实现 AppDelegate 的方法:
static UIWindow *gWindow = nil;
static UIViewController *gTempViewController = nil;
// 把实例方法改为类方法
+ (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
gWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[[UIApplication sharedApplication] delegate] setWindow:gWindow];
gTempViewController = [[UIViewController alloc] init];
gTempViewController.view.backgroundColor = [UIColor redColor];
gWindow.rootViewController = gTempViewController;
[gWindow makeKeyAndVisible];
return YES;
}
至此,启动流程已经串通,简单的组件化架构雏形也已经有了。
网友评论