本文架构由作者本人经过多年对架构的探究和理解,从理论依据到源代码完成,并在开发项目的实际运用中逐步完善,形成了一套对项目的组件化,模块的独立化,而且彻底完成了插件化(热更新计划)的架构计划。特别是插件化(热更新)计划,会让人眼前一亮,能够使iOS开发敏捷转变为跨端开发,对移动端进行共同

YLBDesign开源架构

YLBDesign项目:github.com/ProBobo/YLB…

为什么开源

在作者看来,iOS架构由于资料少,所以大大增加了开发的把握本钱,所以普及率也不高。但是一些大型的项目或多或少需求处理一些代码复用和模块独立的问题。为了提高开发功率,架构在一些项目开展的后期就显得非常重要。因此,开源架构就有其现实意义。

对iOS架构,作者也进行了自己的考虑:由于架构不是一种单一的技能或许组件,而是一系列组件、模块、资源、理论的综合体。由于需求把事务代码当作一个完好的办理目标,所以架构更像是一个代码、代码文件和资源的办理体系。所以许多时分一些开源库仅仅完成了架构中的一部分功用,而不是全部内容。

前语

在此作者供给了iOS架构开源代码。让希望能把握iOS架构的人少斗争几年,敏捷把握,并完成跨端开发。

信任许多人在探究iOS架构的过程中都会发现没有现成的完好的开源架构计划,根本都是开源了一些能够完成架构的部分组件,而没有形成真正的能够完美处理项目模块化,热更新的计划。所以许多时分完美的架构计划还停留在理论阶段。

由于iOS架构并不是很普及,许多人乃至都没有听说过什么是iOS架构,对组件化和模块化更是一窍不通。当碰到项目需求把握根本组件化能力的时分就会显得很被动。但是把握组件化并不是一个很简单的过程,尽管它仅仅iOS架构开始的入门阶段。

最麻烦的事,可能是想要开始iOS架构,却发现相关的资料并不是很丰厚,大部分都是讨论的内容。所以作者特意开源了代码。

YLBDesign的架构组件

架构组件是构成架构的具体代码根底。
架构包括:架构组件、事务模块组件、资源等。

这儿需求说明的是,架构组件仅仅架构理论的一部分,能够是自研的组件,也能够是开源的组件。作为架构应该能够支撑同类型功用的不同组件,完成架构组件的替换,所以架构还会一直开展和丰厚。作者尽量运用开源组件,由于作者信任现在的App根本都会运用开源库,因此能够完成无缝衔接。当没有合适的开源组件能够运用时,作者会运用自研的开源组件。

能够挑选的组件

模块通讯:YLBModule、BeeHive
路由跳转:JLRoutes、MGJRouter
插件化(热更新):小程序(nativesupport.dcloud.net.cn/README)、React Native、自研小程序言语、自研跨端言语

YLBDesign运用的架构组件

为了使作者的架构理论能彻底完成,作者在参考BeeHive的根底上自研了YLBModule模块通讯。
建议大家运用作者在YLBDesign中运用的架构组件,这样能够保证和作者所完成的作用共同,以免呈现作用上的不共同而困惑。
作者所树立的iOS架构支撑线上修正App页面问题,不需求每次修正问题都上线AppStore,小程序在这方面有天然优势(后期会对这方面做详细描绘)。

模块通讯:YLBModule(github.com/ProBobo/YLB…)
路由跳转:JLRoutes(github.com/joeldev/JLR…)、YLBDRouter(github.com/YuliboTeam/…)
插件化(热更新):小程序(nativesupport.dcloud.net.cn/README)

说明:这儿只要小程序没有进行组件化封装,而是运用官方文档进行集成,主要是为了便于理解,和官方文档保持共同。当然,要对小程序进行Pod组件化封装也是能做到的。由于uni-app供给的小程序依靠包太大,有1.6G,上传Github受到限制,当然下载也会很消耗时间。所以作者供给了小程序的集成链接:nativesupport.dcloud.net.cn/README。

为什么运用uni-app的小程序

引用牛顿的话:站在巨人的肩膀上。

作者受微信小程序和支付宝小程序启发,发现小程序作为App中web页面的替代品,支撑在线更新,能够在架构中充任插件的人物,完成跨端开发。这时分又发现uni-app支撑App集成小程序,所以采用了uni-app的小程序。依照uni-app的说法,uni-app先于微信开发出了小程序。

uni-app官网原话:许多人以为小程序是微信先推出的,其实,DCloud才是这个职业的开创者。

App小程序能够快速转化为微信小程序或许支付宝小程序等:小程序作为一个独立开发的言语,运用也非常广泛,把握今后不只能够在iOS、Android端运用,也能够独立开发小程序。uni-app还支撑发布为前端web项目。

这是关于uni-app的描绘:开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快运用等多个渠道。

1、有完好的开发文档,简单把握。
2、一套代码,多端运转
2.1、支撑在iOS端、Android端、H5端运转。
2.2、运用的是前端开发言语,能够进行跨端开发。
2.3、能够完成App小程序快速转化为微信、支付宝等主流小程序。
2.4、有独立的开发工具,能够独立修改小程序,无需编译iOS项目进行发版。
2.5、有自己的插件商场。
3、替代H5,优化用户体会。

模块通讯:YLBModule

相关文章:iOS开源:模块通讯YLBModule

YLBModule完成了模块通讯以及模块消息回传。
每个模块都能够独立为一个App,模块和模块之间没有依靠联系。
为了使模块具有App的能力,我们需求给模块设计生命周期,模块需求有自己的AppDelegate,而且模块间的通讯需求经过通讯接口协议(protocol)完成。

我们需求在模块的AppDelegate里边注册通讯接口协议,同时需求指定模块接口类。即在AppDelegate中需求使通讯接口协议模块接口类相对应,这样经过通讯接口协议就能够找到对应模块。

通讯接口协议将会放在YLBDServices组件中。

YLBModule运用说明

注意:YLBModule依靠库在YLBDBasePod组件中树立依靠联系,对YLBDBasePod进行依靠即可对YLBModule进行依靠。

1、主工程YLBDesign引进YLBModule依靠库(即对YLBDBasePod进行依靠)。
2、在主工程的AppDelegate中引进YLBAppDelegate.h文件,并继承YLBAppDelegate

@import UIKit;
#import <YLBModule/YLBAppDelegate.h>
NS_ASSUME_NONNULL_BEGIN
@interface AppDelegate : YLBAppDelegate <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
NS_ASSUME_NONNULL_END

在didFinishLaunchingWithOptions里边调用super办法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    //super的位置决议当时AppDelegate的优先级是否最高,放在最底部表明当时AppDelegate优先级最高
    [super application:application didFinishLaunchingWithOptions:launchOptions];
    return YES;
}

3、创立主页模块YLBDHome,并引进YLBModule依靠库。
4、在YLBDHome中创立YLBDHomeAppDelegate,用于办理模块生命周期。
5、创立YLBDServices组件,并创立YLBDHomeProtocol协议文件。
6、注册模块:完成模块生命周期

[[YLBModuleManager sharedInstance] registerModuleClass:[self class]];

7、注册服务:经过服务协议能够找到服务类

[[YLBServiceManager sharedInstance] registerService:@protocol(YLBDHomeProtocol) implClass:NSClassFromString(@"YLBDHomeController")];

8、经过服务协议(YLBDHomeProtocol)获取服务类(YLBDHomeController)

//
//  YLBDesignTabBarController.m
//  YLBDesign
//
//  Created by 余礼钵 on 2022/10/2.
//
#import "YLBDesignTabBarController.h"
#import "YLBDesignNavigationController.h"
#import <YLBCommon/YLBCommon.h>
#import <YLBModule/YLBServiceManager.h>
#import <YLBDServices/YLBDHomeProtocol.h>
#import <YLBDServices/YLBDMineProtocol.h>
@interface YLBDesignTabBarController ()<UITabBarControllerDelegate>
@property(nonatomic, strong) NSMutableArray *childVCArray;
@end
@implementation YLBDesignTabBarController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.delegate = self;
    [self setUpChildViewController];
}
#pragma mark - 设置tab
- (void)setUpChildViewController {
    id<YLBDHomeProtocol> homeVC = [[YLBServiceManager sharedInstance] createService:@protocol(YLBDHomeProtocol)];
    UIImage *homeSelectImage = [UIImage imageNamed:@"icon_tabbar_uikit_selected"];
    UIImage *homeNormalImage= [UIImage imageNamed:@"icon_tabbar_uikit"];
    [self setUpChildController:(UIViewController *)homeVC image:homeSelectImage selectImage:homeNormalImage title:@"主页"];
    id<YLBDMineProtocol> mineVC = [[YLBServiceManager sharedInstance] createService:@protocol(YLBDMineProtocol)];
    UIImage *mineSelectImage = [UIImage imageNamed:@"icon_tabbar_lab_selected"];
    UIImage *mineNormalImage= [UIImage imageNamed:@"icon_tabbar_lab"];
    [self setUpChildController:(YLBDesignNavigationController *)mineVC image:mineSelectImage selectImage:mineNormalImage title:@"我的"];
    self.viewControllers = self.childVCArray;
}
- (void)setUpChildController:(UIViewController *)vc image:(UIImage *)image selectImage:(UIImage *)selectImage title:(NSString *)title {
    vc.tabBarItem.title = title;
    vc.tabBarItem.image = image;
    vc.tabBarItem.badgeValue = nil;
    vc.tabBarItem.selectedImage = selectImage;
    YLBDesignNavigationController *navi = [[YLBDesignNavigationController alloc] initWithRootViewController:vc];
    [self.childVCArray addObject:navi];
}
- (NSMutableArray *)childVCArray {
    if (!_childVCArray) {
        _childVCArray = [@[] mutableCopy];
    }
    return _childVCArray;;
}
@end

事务模块组件

主页模块
YLBDHome

pod 'YLBDHome', :git =>'https://github.com/YuliboTeam/YLBDHome.git'

个人中心模块
YLBDMine

pod 'YLBDMine', :git => 'https://github.com/YuliboTeam/YLBDMine.git'

架构服务组件

pod 'YLBDServices', :git => 'https://github.com/YuliboTeam/YLBDServices.git'

事务根底组件

YLBDBasePod

pod 'YLBDBasePod', :git => 'https://github.com/YuliboTeam/YLBDBasePod.git'

运用的根底开源库

pod 'YLBCommon', :git =>'https://github.com/ProBobo/YLBCommon.git'
pod 'YLBProUI', :git => 'https://github.com/YuliboTeam/YLBProUI.git'
pod 'QMUIKit'

关于小程序的开发

1、uni小程序的运用资源集成方式

nativesupport.dcloud.net.cn/UniMPDocs/U…

生成的 uni小程序 wgt 资源包能够布置到长途服务器动态下发也能够直接内置到工程中。

2、uni小程序自带胶囊按钮,假如想让小程序页面和原生共同,能够在pages.json文件中设置titleNView为false,这样小程序中就不会呈现胶囊按钮。

{
            "path": "pages/order/order",
            "style": {
                "navigationBarTitleText": "",
                "app-plus": {
                    "titleNView": false,//禁用原生导航栏
                    "bounce":"none"
                    }
            }
}

3、为了防止小程序呈现版别查看提示框,需求设置manifest.json文件中的ignoreVersion为true

"compatible": {
    "ignoreVersion": true //true表明忽略版别查看提示框,HBuilderX1.9.0及以上版别支撑  
}, 

4、uni小程序运用的也是路由跳转,能够和App的路由跳转进行共同。App端的路由配置文件ClassName.json也能够布置到长途服务器动态下发也能够直接内置到工程中。

{
    "scheme":"YLDesign202210",
    "home":"YLBDHomeController",
    "mine":"YLBDMineController",
    "detail":"YLBDDetailController",
}

所以,小程序页面和原生页面能够完成交换,在修正线上bug时能够节省发版时间。

作者:钵_Right
链接:www.jianshu.com/p/aa35cb7b4…
来源:简书
著作权归作者所有。商业转载请联系作者取得授权,非商业转载请注明出处。