iOS 插件化開發彙總 Small框架

應用插件化背景

目前不少應用功能愈來愈多,軟件顯得愈來愈臃腫。所以插件化就成了不少軟件發展的必經之路,好比支付寶這種平臺級別的軟件:html

支付寶應用

頁上密密麻麻的功能,並且還在增多,照這個趨勢發展下去,軟件包的大小將會不可想象。目前經常使用的解決方案是使用web頁面,但用戶體驗和Native界面是無法比的。html5

設想,若是每個功能點都是一個動態庫,在用戶想使用某個功能的時候讓其從網絡下載,而後手動加載動態庫,實現功能的的插件化,就不再用擔憂功能點的無限增多了,這該是件多麼美好的事!ios

軟件版本實時模塊升級

還在忍受蘋果動輒一週,甚至更長的審覈週期嗎?有了動態庫媽媽就不再用擔憂你的軟件升級了!git

若是軟件中的某個功能點出現了嚴重的bug,或者想在其中新增功能,你的這個功能點又是經過動態庫實現的,這時候你只須要在適當的時候從服務器上將新版本的動態庫文件下載到本地,而後在用戶重啓應用的時候便可實現新功能的展示。github

共享可執行文件

在其它大部分平臺上,動態庫均可以用於不一樣應用間共享,這就大大節省了內存。從目前來看,iOS仍然不容許進程間共享動態庫,即iOS上的動態庫只能是私有的,由於咱們仍然不能將動態庫文件放置在除了自身沙盒之外的其它任何地方。web

不過iOS8上開放了App Extension功能,能夠爲一個應用建立插件,這樣主app和插件之間共享動態庫仍是可行的。json

PS: 上述關於動態庫在iOS平臺的使用,在技術上都是可行的,但本人並無真正嘗試過作出一個上線AppStore的應用,所以並不保證按照上述方式使用動態庫必定能經過蘋果審覈!服務器

模塊化開發的優點:

  • 一、完美內置網絡

    全部插件支持內置於宿主包中app

  • 二、高度透明

    插件編碼、佈局編寫方式與獨立應用開發無異 
    插件代碼調試與整包開發無異 

  • 三、極致裁剪

    對插件分離全部一切能分離的公共代碼、資源 

  • 四、無縫連接

    經過設定URI,宿主、本地化應用插件、本地化web插件、在線網頁,以及任何自定義的插件之間可以相互調起與傳遞參數 

  • 五、跨平臺

    目前已支持Android、iOS以及html5插件。而且三者之間能夠經過同一套Javascript接口進行通訊。

先看一下工程目錄

工程目錄.png

再來看一下效果圖

效果圖

入門

一、 導入模板

   git clone https://github.com/wequick/Small.git
   cd Small/iOS
   cp -r Templates ~/Library/Developer/Xcode/Templates

   重啓Xcode

二、 新建工程
File->New->Project...,選擇Small-pods模板
Small-pods Application.png

三、 安裝Pods

    cd [your-project-path]
    pod install --no-repo-update

四、 關閉工程並打開xcworkspace

    open *.xcworkspace

工程講解

一、工程配置重點

(1)、bundle.json在SMBundle類中,方法

-(instancetype)initWithDictionary:(NSDictionary *)dictionary```

>根據bundle.json配置文件信息查找framework、bundle文件,從而加載到應用中進行使用
NSString *bundlePath = nil;

    NSString *bundleSuffix = @"bundle";
    SMBundleType bundleType = SMBundleTypeAssets;
    if ([pkg rangeOfString:@".app."].location != NSNotFound
        || [pkg rangeOfString:@".lib."].location != NSNotFound) {
        bundleSuffix = @"framework";
        bundleType = SMBundleTypeApplication;
    }
```

以上代碼代表,要加載framework,pkg名稱必須包含.app.(模塊庫)、.lib.(工具庫),不然所有默認加載bundle包。所以bundle.json文件能夠是這樣的:

    "version": "1.0.0",
    "bundles": [
                {
                "uri": "lib.utils",
                "pkg": "net.wequick.example.small.lib.utils"
                },
                {
                "uri": "main",
                "pkg": "net.wequick.example.small.app.main"
                },
                {
                "uri": "home",
                "pkg": "net.wequick.example.small.app.home"
                },
                {
                "uri": "mine",
                "pkg": "net.wequick.example.small.app.mine"
                },
                {
                "uri": "detail",
                "pkg": "net.wequick.example.small.app.detail"
                },
                {
                "uri": "about",
                "pkg": "net.wequick.example.small.web.about"
                }
                ]
}

(2)、framework編譯成功後,名稱跟Product Name同樣,命名規則通常是這樣的
xx_xx_lib_xx
com_example_littleBit_lib_utils               
xx_xx_app_xx               
xx_xx_xx_xx

com_example_littleBit_lib_utils
注意lib、app這些對查找framework文件至關重要,這因此會有"_",是small對"."作了替換

(3)、 Principal class設置,指定模塊入口 

Principal class

(4)framework添加到主工程,不以Linked方式進行添加,使用Build Phases中的Copy Bundle Resources 選項,將framework拖動添加其中便可,這樣能夠完成對framework編譯完後的拷貝

Copy Bundle Resources

(5)、完成添加,進入測試。使用過程當中,有模塊更新代碼後,主工程調用發現功能未更新,這時候須要清理工程,從新編譯;或者修改編譯包配置,從而及時更新。

Edit Scheme

Build Options

用例

  > 須要先編譯Pods

  > 須要去除並行編譯模式:Edit Scheme...->Build->Build Options-> 口 Parallelize Build (取消選中狀態)

各個組件須要簽名後才支持代碼級別更新。示例中更新例子爲xib內容更新。

在沒有設置簽名以前,請在模擬器上跑示例。

參考文獻

Small--Git傳送門
WWDC2014之iOS使用動態庫
iOS使用small建立iOS工程目錄
Small用例

相關文章
相關標籤/搜索