關於IOS模塊化開辟處理計劃網上也有一些引見,但真正落其實在詳細的實例卻很少看到,籌劃編寫體系文章來引見關於我對模塊化處理計劃的懂得,外面會有包括到一些關於解耦、路由、封裝、公有Pod治理等外容;並編寫的一個實例項目放在git停止開源[jiaModuleDemo],外面如今曾經放著一些封裝的功效模塊;會赓續的停止更新,假設你感興致可以Star一下,項目也赓續的更新完美優化;假如你有更好的計劃或許說好的建議可以lssues,我會在短時光停止更新並修正響應的成績;
一:項目中存在的成績
1:當公司外面有多個項目同時停止,而且有能夠是多小我分離分歧項目時,就會存在如上圖湧現的情形,其實每一個APP中都是有許多配合的模塊,固然有能夠你會把雷同功效模塊代碼復制一份在新項目中,但這其實其實不是最好的方法,在前期赓續迭代進程中,分歧的人會往外面增長許多帶有小我顏色的代碼;如許就像雷同的模塊項目前期關於多個項目同一治理也是災害性,有能夠會掉控,哪怕項目轉移他人接辦也會有形中糟蹋許多時光,增長保護本錢,所以實例中更重視關於一些雷同模塊停止提取,求同存異;而模塊化聯合公有Pods停止治理,關於經常使用功效的封裝,只需開放出一些簡略開關設置裝備擺設方法,便可以完成一個功效,好比日記記載、收集要求模塊、收集狀況變更提醒等;
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設置裝備擺設完成;
2:JSPatch熱更新功效
在JiaCore外面也默許集成了熱更新的功效,只需傳入簡略的對象數組就會啟動熱更新;個中JiaPathchModel曾經是界說好的模子,在APP中把接口要求轉化成模子數組,個中patchId是獨一值稱號、md5則是JS文件的MD5值、url是JS的下載途徑、ver則是對哪一個版本起感化;由於普通我們在裡面的APP都是多版本共存,熱更新也要停止版本辨別,只下載與本版原形對應的熱更新JS文件加載;而MD5值則是為了增長平安性,防止JS文件被他人停止修正而影響APP的運轉,在JiaCore會對下載後的JS文件停止MD5盤算並比擬;關於沒有在JSPatchMutableArray之前的JS文件會被刪除;
//熱更新內容 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模塊(個推封裝)
新聞推送關於一個APP是相當主要性,普通是采取第三方的SDK停止集成,其實年夜部門的SDK處置代碼都是差不多,在這實例中對差別化的內容停止提取,實例中將以個推動行模塊化,由於新聞推送的年夜部門代碼都集中在AppDelegate中,形成的一年夜堆混亂代碼,固然也有一部門人對AppDelegate停止擴大分類停止移除代碼,實例中將采取別的一種處理計劃停止抽取,可以到達完整解耦,在詳細的APP外面將不會再湧現個推SDK相干內容,只需簡略停止設置裝備擺設跟處置新聞便可以,上面只是簡略的列出部門代碼,其它封裝代碼見源代碼;
//設置個推模塊的設置裝備擺設 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計劃
實例中只是把相干模塊化的提取都在一個工程停止表現,最初照樣要落實聯合Pods停止治理,把每一個模塊離開治理,分歧的APP可以簡略經由過程Pods指令便可以到達引入模塊的後果,關於一些雷同模塊可以在分歧的APP反復援用,減小反復開辟本錢;
以上所述是小編給年夜家引見的IOS中關於模塊化開辟處理計劃(純干貨),願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對本站網站的支撐!
【iOS中關於模塊化開辟處理計劃(純干貨)】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!