目前不少應用功能愈來愈多,軟件顯得愈來愈臃腫。所以插件化就成了不少軟件發展的必經之路,好比支付寶這種平臺級別的軟件: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接口進行通訊。
一、 導入模板
git clone https://github.com/wequick/Small.git cd Small/iOS cp -r Templates ~/Library/Developer/Xcode/Templates
重啓Xcode
二、 新建工程
File
->New
->Project...
,選擇Small-pods
模板
三、 安裝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
注意lib、app這些對查找framework文件至關重要,這因此會有"_",是small對"."作了替換
(3)、
Principal class
設置,指定模塊入口
(4)
framework
添加到主工程,不以Linked
方式進行添加,使用Build Phases
中的Copy Bundle Resources
選項,將framework
拖動添加其中便可,這樣能夠完成對framework
編譯完後的拷貝
(5)、完成添加,進入測試。使用過程當中,有模塊更新代碼後,主工程調用發現功能未更新,這時候須要清理工程,從新編譯;或者修改編譯包配置,從而及時更新。
> 須要先編譯Pods
> 須要去除並行編譯模式:Edit Scheme...
->Build
->Build Options
-> 口 Parallelize Build
(取消選中狀態)
各個組件須要簽名後才支持代碼級別更新。示例中更新例子爲
xib
內容更新。
在沒有設置簽名以前,請在模擬器上跑示例。