iOS架構:從開發到跨端架構師,實現iOS開發對Android進行跨端開發,一套代碼多端使用。

相關文章:iOS開源:模塊通信YLBModule
稀土掘金:iOS架構:從開發到跨端架構師,實現iOS開發對Android進行跨端開發,一套代碼多端使用。

本文架構由作者本人經過多年對架構的探索和理解,從理論依據到源代碼實現,并在開發項目的實際應用中逐步完善,形成了一套對項目的組件化,模塊的獨立化,并且完全實現了插件化(熱更新方案)的架構方案。特別是插件化(熱更新)方案,會讓人眼前一亮,可以使iOS開發迅速轉變為跨端開發,對移動端進行統一

YLBDesign開源架構

YLBDesign項目:https://github.com/ProBobo/YLBDesign

為什么開源

在作者看來,iOS架構因為資料少,所以大大增加了開發的掌握成本,所以普及率也不高。然而一些大型的項目或多或少需要解決一些代碼復用和模塊獨立的問題。為了提升開發效率,架構在一些項目發展的后期就顯得非常重要。因此,開源架構就有其現實意義。

對iOS架構,作者也進行了自己的思考:因為架構不是一種單一的技術或者組件,而是一系列組件、模塊、資源、理論的綜合體。因為需要把業務代碼當作一個完整的管理對象,所以架構更像是一個代碼和資源的管理系統。所以很多時候一些開源庫只是實現了架構中的一部分功能,而不是全部內容。

前言

在此作者提供了iOS架構開源代碼。讓希望能掌握iOS架構的人少奮斗幾年,迅速掌握,并實現跨端開發。

相信很多人在探索iOS架構的過程中都會發現沒有現成的完整的開源架構方案,基本都是開源了一些可以實現架構的部分組件,而沒有形成真正的可以完美解決項目模塊化,熱更新的方案。所以很多時候完美的架構方案還停留在理論階段。

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

最麻煩的事,可能是想要開始iOS架構,卻發現相關的資料并不是很豐富,大部分都是探討的內容。所以作者特意開源了代碼。

YLBDesign的架構組件

架構組件是構成架構的具體代碼基礎。
架構包括:架構組件、業務模塊組件、資源等。

這里需要說明的是,架構組件只是架構理論的一部分,可以是自研的組件,也可以是開源的組件。作為架構應該可以支持同類型功能的不同組件,實現架構組件的替換,所以架構還會一直發展和豐富。作者盡量使用開源組件,因為作者相信現在的App基本都會使用開源庫,因此可以實現無縫連接。當沒有合適的開源組件可以使用時,作者會使用自研的開源組件。

可以選擇的組件

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

YLBDesign使用的架構組件

為了使作者的架構理論能完全實現,作者在參考BeeHive的基礎上自研了YLBModule模塊通信。
建議大家使用作者在YLBDesign中使用的架構組件,這樣可以確保和作者所實現的效果一致,以免出現效果上的不一致而困惑。
作者所建立的iOS架構支持線上修復App頁面問題,不需要每次修復問題都上線AppStore,小程序在這方面有天然優勢(后期會對這方面做詳細描述)。

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

路由跳轉:JLRoutes(https://github.com/joeldev/JLRoutes)、YLBDRouter(https://github.com/YuliboTeam/YLBDRouter

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

說明:這里只有小程序沒有進行組件化封裝,而是使用官方文檔進行集成,主要是為了便于理解,和官方文檔保持一致。當然,要對小程序進行Pod組件化封裝也是能做到的。由于uni-app提供的小程序依賴包太大,有1.6G,上傳Github受到限制,當然下載也會很消耗時間。所以作者提供了小程序的集成鏈接:https://nativesupport.dcloud.net.cn/READMEhttps://www.dcloud.io

為什么使用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小程序的應用資源集成方式

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

生成的 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時可以節約發版時間。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容