應用插件化背景
目前很多應用功能越來越多,軟件顯得越來越臃腫。因此插件化就成了很多軟件發展的必經之路,比如支付寶這種平臺級別的軟件:
頁上密密麻麻的功能,而且還在增多,照這個趨勢發展下去,軟件包的大小將會不可想象。目前常用的解決方案是使用web頁面,但用戶體驗和Native界面是沒法比的。
設想,如果每一個功能點都是一個動態庫,在用戶想使用某個功能的時候讓其從網絡下載,然后手動加載動態庫,實現功能的的插件化,就再也不用擔心功能點的無限增多了,這該是件多么美好的事!
軟件版本實時模塊升級
還在忍受蘋果動輒一周,甚至更長的審核周期嗎?有了動態庫媽媽就再也不用擔心你的軟件升級了!
如果軟件中的某個功能點出現了嚴重的bug,或者想在其中新增功能,你的這個功能點又是通過動態庫實現的,這時候你只需要在適當的時候從服務器上將新版本的動態庫文件下載到本地,然后在用戶重啟應用的時候即可實現新功能的展現。
共享可執行文件
在其它大部分平臺上,動態庫都可以用于不同應用間共享,這就大大節省了內存。從目前來看,iOS仍然不允許進程間共享動態庫,即iOS上的動態庫只能是私有的,因為我們仍然不能將動態庫文件放置在除了自身沙盒以外的其它任何地方。
不過iOS8上開放了App Extension功能,可以為一個應用創建插件,這樣主app和插件之間共享動態庫還是可行的。
PS: 上述關于動態庫在iOS平臺的使用,在技術上都是可行的,但本人并沒有真正嘗試過做出一個上線AppStore的應用,因此并不保證按照上述方式使用動態庫一定能通過蘋果審核!
模塊化開發的優勢:
- 1、完美內置
所有插件支持內置于宿主包中
- 2、高度透明
插件編碼、布局編寫方式與獨立應用開發無異
插件代碼調試與整包開發無異
- 3、極致裁剪
對插件分離所有一切能分離的公共代碼、資源
- 4、無縫鏈接
通過設定URI,宿主、本地化應用插件、本地化web插件、在線網頁,以及任何自定義的插件之間能夠相互調起與傳遞參數
- 5、跨平臺
目前已支持Android、iOS以及html5插件。并且三者之間可以通過同一套Javascript接口進行通信。
先看一下工程目錄
再來看一下效果圖
入門
1、 導入模板
git clone https://github.com/wequick/Small.git
cd Small/iOS
cp -r Templates ~/Library/Developer/Xcode/Templates
重啟Xcode
2、 新建工程
File
->New
->Project...
,選擇Small-pods
模板
3、 安裝Pods
cd [your-project-path]
pod install --no-repo-update
```
#####4、 關閉工程并打開xcworkspace
```bash
open *.xcworkspace
```
## 工程講解
#####1、工程配置重點
> (1)、bundle.json在SMBundle類中,方法
```bash
-(instancetype)initWithDictionary:(NSDictionary *)dictionary```
>根據bundle.json配置文件信息查找framework、bundle文件,從而加載到應用中進行使用
```bash
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
注意lib、app這些對查找framework文件相當重要,這所以會有"_",是small對"."做了替換
(3)、
Principal class
設置,指定模塊入口
(4)
framework
添加到主工程,不以Linked
方式進行添加,使用Build Phases
中的Copy Bundle Resources
選項,將framework
拖動添加其中即可,這樣可以完成對framework
編譯完后的拷貝
(5)、完成添加,進入測試。使用過程中,有模塊更新代碼后,主工程調用發現功能未更新,這時候需要清理工程,重新編譯;或者修改編譯包配置,從而及時更新。
用例
-
使用者模式Sample
需要先編譯Pods
-
開發者模式DevSample
需要去除并行編譯模式:
Edit Scheme...
->Build
->Build Options
->口 Parallelize Build
(取消選中狀態)
各個組件需要簽名后才支持代碼級別更新。示例中更新例子為
xib
內容更新。在沒有設置簽名之前,請在模擬器上跑示例。