iOS架構(gòu):從開發(fā)到跨端架構(gòu)師,實(shí)現(xiàn)iOS開發(fā)對Android進(jìn)行跨端開發(fā)溜哮,一套代碼多端使用滔金。

相關(guān)文章:iOS開源:模塊通信YLBModule
稀土掘金:iOS架構(gòu):從開發(fā)到跨端架構(gòu)師,實(shí)現(xiàn)iOS開發(fā)對Android進(jìn)行跨端開發(fā)茂嗓,一套代碼多端使用鹦蠕。

本文架構(gòu)由作者本人經(jīng)過多年對架構(gòu)的探索和理解,從理論依據(jù)到源代碼實(shí)現(xiàn)在抛,并在開發(fā)項(xiàng)目的實(shí)際應(yīng)用中逐步完善钟病,形成了一套對項(xiàng)目的組件化,模塊的獨(dú)立化刚梭,并且完全實(shí)現(xiàn)了插件化(熱更新方案)的架構(gòu)方案肠阱。特別是插件化(熱更新)方案,會讓人眼前一亮朴读,可以使iOS開發(fā)迅速轉(zhuǎn)變?yōu)榭缍碎_發(fā)屹徘,對移動端進(jìn)行統(tǒng)一

YLBDesign開源架構(gòu)

YLBDesign項(xiàng)目:https://github.com/ProBobo/YLBDesign

為什么開源

在作者看來衅金,iOS架構(gòu)因?yàn)橘Y料少噪伊,所以大大增加了開發(fā)的掌握成本,所以普及率也不高氮唯。然而一些大型的項(xiàng)目或多或少需要解決一些代碼復(fù)用和模塊獨(dú)立的問題鉴吹。為了提升開發(fā)效率,架構(gòu)在一些項(xiàng)目發(fā)展的后期就顯得非常重要惩琉。因此豆励,開源架構(gòu)就有其現(xiàn)實(shí)意義。

對iOS架構(gòu)瞒渠,作者也進(jìn)行了自己的思考:因?yàn)?code>架構(gòu)不是一種單一的技術(shù)或者組件良蒸,而是一系列組件、模塊伍玖、資源嫩痰、理論的綜合體。因?yàn)樾枰褬I(yè)務(wù)代碼當(dāng)作一個完整的管理對象窍箍,所以架構(gòu)更像是一個代碼和資源的管理系統(tǒng)串纺。所以很多時候一些開源庫只是實(shí)現(xiàn)了架構(gòu)中的一部分功能丽旅,而不是全部內(nèi)容。

前言

在此作者提供了iOS架構(gòu)開源代碼造垛。讓希望能掌握iOS架構(gòu)的人少奮斗幾年,迅速掌握晰搀,并實(shí)現(xiàn)跨端開發(fā)五辽。

相信很多人在探索iOS架構(gòu)的過程中都會發(fā)現(xiàn)沒有現(xiàn)成的完整的開源架構(gòu)方案,基本都是開源了一些可以實(shí)現(xiàn)架構(gòu)的部分組件外恕,而沒有形成真正的可以完美解決項(xiàng)目模塊化杆逗,熱更新的方案。所以很多時候完美的架構(gòu)方案還停留在理論階段鳞疲。

由于iOS架構(gòu)并不是很普及罪郊,很多人甚至都沒有聽說過什么是iOS架構(gòu),對組件化和模塊化更是一竅不通尚洽。當(dāng)碰到項(xiàng)目需要掌握基本組件化能力的時候就會顯得很被動悔橄。然而掌握組件化并不是一個很容易的過程,雖然它只是iOS架構(gòu)開始的入門階段腺毫。

最麻煩的事癣疟,可能是想要開始iOS架構(gòu),卻發(fā)現(xiàn)相關(guān)的資料并不是很豐富潮酒,大部分都是探討的內(nèi)容睛挚。所以作者特意開源了代碼。

YLBDesign的架構(gòu)組件

架構(gòu)組件是構(gòu)成架構(gòu)的具體代碼基礎(chǔ)急黎。
架構(gòu)包括:架構(gòu)組件扎狱、業(yè)務(wù)模塊組件、資源等勃教。

這里需要說明的是淤击,架構(gòu)組件只是架構(gòu)理論的一部分,可以是自研的組件故源,也可以是開源的組件遭贸。作為架構(gòu)應(yīng)該可以支持同類型功能的不同組件,實(shí)現(xiàn)架構(gòu)組件的替換心软,所以架構(gòu)還會一直發(fā)展和豐富壕吹。作者盡量使用開源組件,因?yàn)樽髡呦嘈努F(xiàn)在的App基本都會使用開源庫删铃,因此可以實(shí)現(xiàn)無縫連接耳贬。當(dāng)沒有合適的開源組件可以使用時,作者會使用自研的開源組件猎唁。

可以選擇的組件

模塊通信:YLBModule咒劲、BeeHive
路由跳轉(zhuǎn):JLRoutes、MGJRouter
插件化(熱更新):小程序(https://nativesupport.dcloud.net.cn/README)、React Native腐魂、自研小程序語言帐偎、自研跨端語言

YLBDesign使用的架構(gòu)組件

為了使作者的架構(gòu)理論能完全實(shí)現(xiàn),作者在參考BeeHive的基礎(chǔ)上自研了YLBModule模塊通信蛔屹。
建議大家使用作者在YLBDesign中使用的架構(gòu)組件削樊,這樣可以確保和作者所實(shí)現(xiàn)的效果一致,以免出現(xiàn)效果上的不一致而困惑兔毒。
作者所建立的iOS架構(gòu)支持線上修復(fù)App頁面問題漫贞,不需要每次修復(fù)問題都上線AppStore,小程序在這方面有天然優(yōu)勢(后期會對這方面做詳細(xì)描述)育叁。

模塊通信:YLBModule(https://github.com/ProBobo/YLBModule

路由跳轉(zhuǎn):JLRoutes(https://github.com/joeldev/JLRoutes)迅脐、YLBDRouter(https://github.com/YuliboTeam/YLBDRouter

插件化(熱更新):小程序(https://nativesupport.dcloud.net.cn/READMEhttps://www.dcloud.io

說明:這里只有小程序沒有進(jìn)行組件化封裝豪嗽,而是使用官方文檔進(jìn)行集成谴蔑,主要是為了便于理解,和官方文檔保持一致龟梦。當(dāng)然树碱,要對小程序進(jìn)行Pod組件化封裝也是能做到的。由于uni-app提供的小程序依賴包太大变秦,有1.6G成榜,上傳Github受到限制,當(dāng)然下載也會很消耗時間蹦玫。所以作者提供了小程序的集成鏈接:https://nativesupport.dcloud.net.cn/README赎婚、https://www.dcloud.io

為什么使用uni-app的小程序

引用牛頓的話:站在巨人的肩膀上樱溉。

作者受微信小程序和支付寶小程序啟發(fā)挣输,發(fā)現(xiàn)小程序作為App中web頁面的替代品,支持在線更新福贞,可以在架構(gòu)中充當(dāng)插件的角色撩嚼,實(shí)現(xiàn)跨端開發(fā)。這時候又發(fā)現(xiàn)uni-app支持App集成小程序挖帘,所以采用了uni-app的小程序完丽。按照uni-app的說法,uni-app先于微信開發(fā)出了小程序拇舀。

uni-app官網(wǎng)原話:很多人以為小程序是微信先推出的逻族,其實(shí),DCloud才是這個行業(yè)的開創(chuàng)者骄崩。

App小程序可以快速轉(zhuǎn)化為微信小程序或者支付寶小程序等:小程序作為一個獨(dú)立開發(fā)的語言聘鳞,應(yīng)用也非常廣泛薄辅,掌握以后不僅可以在iOS、Android端使用抠璃,也可以獨(dú)立開發(fā)小程序站楚。uni-app還支持發(fā)布為前端web項(xiàng)目。

這是關(guān)于uni-app的描述:開發(fā)者編寫一套代碼搏嗡,可發(fā)布到iOS窿春、Android、Web(響應(yīng)式)彻况、以及各種小程序(微信/支付寶/百度/頭條/飛書/QQ/快手/釘釘/淘寶)谁尸、快應(yīng)用等多個平臺舅踪。

1纽甘、有完整的開發(fā)文檔,容易掌握抽碌。
2悍赢、一套代碼,多端運(yùn)行货徙。
2.1左权、支持在iOS端、Android端痴颊、H5端運(yùn)行赏迟。
2.2、使用的是前端開發(fā)語言蠢棱,可以進(jìn)行跨端開發(fā)锌杀。
2.3、可以實(shí)現(xiàn)App小程序快速轉(zhuǎn)化為微信泻仙、支付寶等主流小程序糕再。
2.4、有獨(dú)立的開發(fā)工具玉转,可以獨(dú)立修改小程序突想,無需編譯iOS項(xiàng)目進(jìn)行發(fā)版。
2.5究抓、有自己的插件市場猾担。
3、替代H5刺下,優(yōu)化用戶體驗(yàn)垒探。

模塊通信:YLBModule

文章:iOS開源:模塊通信YLBModule

YLBModule實(shí)現(xiàn)了模塊通信以及模塊消息回傳。
每個模塊都可以獨(dú)立為一個App怠李,模塊和模塊之間沒有依賴關(guān)系圾叼。
為了使模塊具有App的能力蛤克,我們需要給模塊設(shè)計(jì)生命周期,模塊需要有自己的AppDelegate夷蚊,并且模塊間的通信需要通過通信接口協(xié)議(protocol)實(shí)現(xiàn)构挤。

我們需要在模塊的AppDelegate里面注冊通信接口協(xié)議,同時需要指定模塊接口類惕鼓。即在AppDelegate中需要使通信接口協(xié)議模塊接口類相對應(yīng)筋现,這樣通過通信接口協(xié)議就可以找到對應(yīng)模塊。

通信接口協(xié)議將會放在YLBDServices組件中箱歧。

YLBModule使用說明

注意:YLBModule依賴庫在YLBDBasePod組件中建立依賴關(guān)系矾飞,對YLBDBasePod進(jìn)行依賴即可對YLBModule進(jìn)行依賴。

1呀邢、主工程YLBDesign引入YLBModule依賴庫(即對YLBDBasePod進(jìn)行依賴)洒沦。
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里面調(diào)用super方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    
    //super的位置決定當(dāng)前AppDelegate的優(yōu)先級是否最高申眼,放在最底部表示當(dāng)前AppDelegate優(yōu)先級最高
    [super application:application didFinishLaunchingWithOptions:launchOptions];
    
    return YES;
}

3、創(chuàng)建首頁模塊YLBDHome蝉衣,并引入YLBModule依賴庫括尸。
4、在YLBDHome中創(chuàng)建YLBDHomeAppDelegate病毡,用于管理模塊生命周期濒翻。
5、創(chuàng)建YLBDServices組件啦膜,并創(chuàng)建YLBDHomeProtocol協(xié)議文件有送。
6、注冊模塊:實(shí)現(xiàn)模塊生命周期

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

7功戚、注冊服務(wù):通過服務(wù)協(xié)議可以找到服務(wù)類

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

8娶眷、通過服務(wù)協(xié)議(YLBDHomeProtocol)獲取服務(wù)類(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 - 設(shè)置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

業(yè)務(wù)模塊組件

首頁模塊
YLBDHome

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

個人中心模塊
YLBDMine

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

架構(gòu)服務(wù)組件

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

業(yè)務(wù)基礎(chǔ)組件

YLBDBasePod

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

使用的基礎(chǔ)開源庫

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

關(guān)于小程序的開發(fā)

1、uni小程序的應(yīng)用資源集成方式

https://nativesupport.dcloud.net.cn/UniMPDocs/UseSdk/ios?id=uni小程序的應(yīng)用資源集成方式

生成的 uni小程序 wgt 資源包可以部署到遠(yuǎn)程服務(wù)器動態(tài)下發(fā)也可以直接內(nèi)置到工程中啸臀。

2届宠、uni小程序自帶膠囊按鈕,如果想讓小程序頁面和原生一致乘粒,可以在pages.json文件中設(shè)置titleNView為false豌注,這樣小程序中就不會出現(xiàn)膠囊按鈕。

{
            "path": "pages/order/order",
            "style": {
                "navigationBarTitleText": "",
                "app-plus": {
                    "titleNView": false,//禁用原生導(dǎo)航欄
                    "bounce":"none"
                    }
            }
}

3灯萍、為了避免小程序出現(xiàn)版本檢查提示框轧铁,需要設(shè)置manifest.json文件中的ignoreVersion為true

"compatible": {
    "ignoreVersion": true //true表示忽略版本檢查提示框,HBuilderX1.9.0及以上版本支持  
}, 

4旦棉、uni小程序使用的也是路由跳轉(zhuǎn)齿风,可以和App的路由跳轉(zhuǎn)進(jìn)行統(tǒng)一药薯。App端的路由配置文件ClassName.json也可以部署到遠(yuǎn)程服務(wù)器動態(tài)下發(fā)也可以直接內(nèi)置到工程中。

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

所以救斑,小程序頁面和原生頁面可以實(shí)現(xiàn)互換童本,在修復(fù)線上bug時可以節(jié)約發(fā)版時間。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脸候,一起剝皮案震驚了整個濱河市穷娱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌运沦,老刑警劉巖泵额,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異携添,居然都是意外死亡嫁盲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門薪寓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亡资,“玉大人澜共,你說我怎么就攤上這事向叉。” “怎么了嗦董?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵母谎,是天一觀的道長。 經(jīng)常有香客問我京革,道長奇唤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任匹摇,我火速辦了婚禮咬扇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘廊勃。我一直安慰自己懈贺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布坡垫。 她就那樣靜靜地躺著梭灿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冰悠。 梳的紋絲不亂的頭發(fā)上堡妒,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機(jī)與錄音溉卓,去河邊找鬼皮迟。 笑死搬泥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伏尼。 我是一名探鬼主播佑钾,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烦粒!你這毒婦竟也來了休溶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤扰她,失蹤者是張志新(化名)和其女友劉穎兽掰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徒役,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孽尽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忧勿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杉女。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸳吸,靈堂內(nèi)的尸體忽然破棺而出熏挎,到底是詐尸還是另有隱情,我是刑警寧澤晌砾,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布坎拐,位于F島的核電站,受9級特大地震影響养匈,放射性物質(zhì)發(fā)生泄漏哼勇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一呕乎、第九天 我趴在偏房一處隱蔽的房頂上張望积担。 院中可真熱鬧,春花似錦猬仁、人聲如沸帝璧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聋溜。三九已至,卻和暖如春叭爱,著一層夾襖步出監(jiān)牢的瞬間撮躁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工买雾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留把曼,地道東北人杨帽。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像嗤军,于是被迫代替她去往敵國和親注盈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容