2:对于页面之间相互耦合,而页面之间的传参也各不相同,由于不同的开发人员或者简便方式等原因,传参的类型都有差异,包含如实体、简单基本类型等,先前项目对于路由方式也不支持,导致要实现收到消息推送进行不同的页面跳转存在硬编码情况,对于功能扩展存在相当大的问题;而右边则是模块化后页面之间的交互方式;页面之间也不存在耦合关系,都只跟JiaMediator这个中介者相依赖;而传参都统一成以字典的形式;虽然可能牺牲一些方便跟随意,却可以解耦模块化;并且加入对路由方式的处理;约定好相关的协议进行交互;用这种路由方式代替那些第三方的路由插件则是因为它的灵活性,最主要还是省去了第三方路由插件在启动时要注册路由的问题;
二:解决方案实现之模块化
1:JiaCore(基础功能封装)
JiaCore是整个APP最基础模块,所有的模块化都要依赖,主要包含一些全局的功能模块,比如JiaBaseViewController、JiaAppDelegate等;目前已经把一些默认的功能进行集成在里面,包含网络状态变化判断及提示、日志记录功能等;并把一些相关配置的内容用JiaCoreConfigManager这个管理类进行统一设置,比如是否打开日志记录功能;JiaCoreConfigManager类则是开放给具体APP设置全局的相关配置;下面就以其中一个日志记录功能进行讲解:
//JiaCore基础模块相关配置JiaCoreConfigManager *jiaCoreConfig=[JiaCoreConfigManager sharedInstance];jiaCoreConfig.recordlogger=YES;然后具体APP的PrefixHeader.pch引入命名空间并进行设置记录日志的等级:#import "JiaCocoaLumberjack.h"//DDLog等级static const int ddLogLevel = DDLogLevelVerbose;这样就完成的一个APP对于日志记录模块的引入,JiaCore已经帮你完成的关于日志记录的相关配置,并且错误内容以一种可读性较好的格式记录到file文件中,而且这些file文件生成规则也都定义好了,当然如何时你要是在Xcode控制台显示不同等级色彩,只要安装XcodeColors插件并简单进行设置就可以了,对于不同等级不同色彩都已经在JiaCore配置完成;
//热更新内容JiaPathchModel *sample=[[JiaPathchModel alloc]init];sample.patchId = @"patchId_sample1";sample.md5 = @"2cf1c6f6c5632dc21224bf42c698706b";sample.url = @"http://test.qshmall.net:9090/demo1.js";sample.ver = @"1";JiaPathchModel *sample1=[[JiaPathchModel alloc]init];sample1.patchId = @"patchId_sample2";sample1.md5 = @"e8a4eaeadce5a4598fb9a868e09c75fd";sample1.url = @"http://test.qshmall.net:9090/demo2.js";sample1.ver = @"1";//JiaCore基础模块相关配置JiaCoreConfigManager *jiaCoreConfig=[JiaCoreConfigManager sharedInstance];jiaCoreConfig.jSPatchMutableArray=[@[sample,sample1] mutableCopy];3:JiaGT模块(个推封装)
//设置个推模块的配置jiaGTConfigManager *gtConfig=[jiaGTConfigManager sharedInstance];gtConfig.jiaGTAppId=@"0uuwznWonIANoK07JeRWgAs";gtConfig.jiaGTAppKey=@"26LeO4stbrA7TeyMUJdXlx3";gtConfig.jiaGTAppSecret=@"2282vl0IwZd9KL3ZpDyoUL7";#pragma mark 消息推送相关处理/*** @author wujunyang, 16-07-07 16:07:25** @brief 处理个推消息** @param NotificationMessage*/-(void)gtNotification:(NSDictionary *)NotificationMessage{NSLog(@"%@",NotificationMessage[@"payload"]);NSLog(@"-----接收到个推通知------");}/*** @author wujunyang, 16-07-07 16:07:40** @brief 处理远程苹果通知** @param RemoteNotificationMessage*/-(void)receiveRemoteNotification:(NSDictionary *)RemoteNotificationMessage{NSLog(@"%@",RemoteNotificationMessage[@"message"]);NSLog(@"-----接收到苹果通知------");}/*** @author wujunyang, 16-09-21 14:09:33** @brief 获得注册成功时的deviceToken 可以在里面做一些绑定操作** @param deviceToken <#deviceToken description#>*/-(void)receiveDeviceToken:(NSString *)deviceToken{NSLog(@"-----当前deviceToken:%@------",deviceToken);}
4:JiaAnalytics模块(友盟统计封装)
JiaAnalytics模块是在友盟统计SDK跟Aspect相结合基础上完成,对于页面的进出统计采用Aop切面方式进行,把原本应该在每个页面生命周期的统计代码移除,App运用只要简单配置友盟相对应的信息,也可以设置要统计页面的过滤条件,目前已经有三种如要统计的开头页面的前缀字符串数组、要统计的页面名称字符串数组、不统计的页面名称字符串数组;可以结合使用,达到精确统计页面的目的;而且把统计的代码放在异步线程进行,不会影响主线程的响应;
__weak typeof(self) ws = self;dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{[UIViewController aspect_hookSelector:@selector(viewWillAppear:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info, BOOL animated){UIViewController *controller = [info instance];BOOL filterResult=[ws fileterWithControllerName:NSStringFromClass([controller class])];if (filterResult) {[ws beginLogPageView:[controller class]];}} error:NULL];[UIViewController aspect_hookSelector:@selector(viewWillDisappear:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info, BOOL animated){UIViewController *controller = [info instance];BOOL filterResult=[ws fileterWithControllerName:NSStringFromClass([controller class])];if (filterResult) {[ws endLogPageView:[controller class]];}} error:NULL];});
三:解决方案实现之页面解耦
JiaMediator起到一个中介的作用,所有的模块间响应交互都是通过它进行,每个模块都会对它进行扩展分类(例如:JiaMediator+模块A),分类主要是为了用于本地间调用而又不想用路由的方式,若要用路由的方式则要注意关于路由约束准确编写,它将会直接影响到能否正确响应到目标;实例中也有关于使用通知的方式进行回调参数的回传问题;
实例代码如下:
NSDictionary *curParams=@{kDesignerModuleActionsDictionaryKeyName:@"wujunyang",kDesignerModuleActionsDictionaryKeyID:@"1001",kDesignerModuleActionsDictionaryKeyImage:@"designerImage"};switch (indexPath.row) {case 0:{UIViewController *viewController=[[JiaMediator sharedInstance]JiaMediator_Designer_viewControllerForDetail:curParams];[self presentViewController:viewController animated:YES completion:nil];break;}case 1:{UIViewController *viewController=[[JiaMediator sharedInstance]JiaMediator_Designer_viewControllerForDetail:curParams];[self.navigationController pushViewController:viewController animated:YES];break;}case 2:{NSString *curRoue=@"jiaScheme://Designer/nativeFetchDetailViewController?name=wujunyang&ID=1001&image=designerImage";UIViewController *viewController=[[JiaMediator sharedInstance]performActionWithUrl:[NSURL URLWithString:curRoue] completion:^(NSDictionary *info) {}];[self.navigationController pushViewController:viewController animated:YES];break;}case 3:{NSDictionary *userParaDictionary=@{kUserModuleActionsDictionaryKeyID:@"1"};UIViewController *viewController=[[JiaMediator sharedInstance] JiaMediator_User_viewControllerForDetail:userParaDictionary];[self.navigationController pushViewController:viewController animated:YES];break;}default:break;}四:模块化结合私有Pods方案
以上所述是小编给大家介绍的iOS中关于模块化开发解决方案(纯干货),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!