iOS 插件化开发汇总 Small框架
应用插件化背景
目前很多应用功能越来越多,软件显得越来越臃肿。因此插件化就成了很多软件发展的必经之路,比如支付宝这种平台级别的软件:

页上密密麻麻的功能,而且还在增多,照这个趋势发展下去,软件包的大小将会不可想象。目前常用的解决方案是使用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
open *.xcworkspace
工程讲解
1、工程配置重点
(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)、完成添加,进入测试。使用过程中,有模块更新代码后,主工程调用发现功能未更新,这时候需要清理工程,重新编译;或者修改编译包配置,从而及时更新。


用例
- 使用者模式Sample
> 需要先编译Pods
- 开发者模式DevSample
> 需要去除并行编译模式:Edit Scheme...->Build->Build Options-> 口 Parallelize Build (取消选中状态)
各个组件需要签名后才支持代码级别更新。示例中更新例子为
xib内容更新。
在没有设置签名之前,请在模拟器上跑示例。
参考文献
Small--Git传送门
WWDC2014之iOS使用动态库
iOS使用small创建iOS工程目录
Small用例
iOS 插件化开发汇总 Small框架的更多相关文章
- Android 使用动态载入框架DL进行插件化开发
如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 (来自时之沙的csdn博客) 概述: 随着应用的不断迭代.应用的体积不断增大,项目越来越臃肿,冗余添 ...
- Android组件化和插件化开发
http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...
- TinyFrame升级之八:实现简易插件化开发
本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...
- Android插件化开发
客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...
- NET 平台下的插件化开发内核
.NET 平台下的插件化开发内核(Rabbit Kernel) 每个程序猿都有一个框架梦,曾经在2013年8月15日写过一篇“Koala Framework是什么?我为什么要写这个框架?”的文章, ...
- 【我的Android进阶之旅】Android插件化开发学习资料
1.目前开源的插件开发框架大致有哪些? 1. 任玉刚 的 dynamic-load-apk Github 地址:https://github.com/singwhatiwanna/dynamic-lo ...
- Android插件化开发,初入殿堂
好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架CJFrameForAndroid. 好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架C ...
- Android 插件化开发(四):插件化实现方案
在经过上面铺垫后,我们可以尝试整体实现一下插件化了.这里我们先介绍一下最简单的实现插件化的方案. 一.最简单的插件化实现方案 最简单的插件化实现方案,对四大组件都是适用的,技术面涉及如下: 1). 合 ...
- Android 插件化开发(一):Java 反射技术介绍
写在前面:学习插件化开发推荐书籍<Android 插件化开发指南>,本系列博客所整理知识部分内容出自此书. 在之前的项目架构的博文中,我们提到了项目插件化架构,提到插件化架构不得不提的到J ...
随机推荐
- Tesseract-OCR使用记录
Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文). ...
- 常用HQL集锦
1.根据ID查询某"一个"实体类 方法1: String hql = "From ClassEntity as c where c.id=?"; ClassEn ...
- 项目经验分享——Java常用工具类集合 转
http://blog.csdn.net/xyw591238/article/details/51678525 写在前面 本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数 ...
- CentOS 6.5 GIT 服务器搭建
环境: Git Sserver IP: 10.6.0.2 Git Client IP: 10.6.0.126 1. 在 Git Server 安装软件所需的依赖包 yum install curl-d ...
- 解决在某些IE浏览器下字符乱码的问题
习惯上我们写字符声明都是 <meta charset="utf-8"> 在绝大多数浏览器都没有问题,但是在操蛋的IE上有时候会出现编码错误!! 解决方案: <me ...
- 为CKEditor开发插入代码的插件 已提供下载
http://www.cnblogs.com/moozi/archive/2010/01/06/1640034.html
- iOS开发 改变UINavigationController的UINavigationBar的高度和背景图片
1.改变高度 自定义UINavigationBar的新类别: //UINavigationBar+BackgoundImage.h #import <Foundation/Foundation. ...
- HUST 1354 Rubiks
背包.注释写详细了. 本想这样写:每个组内各自做背包,然后组间做背包,但是由于这题M=10000,时间复杂度太大. #include<cstdio> #include<cstring ...
- Ubuntu 12.04下PHP环境的搭建(LAMP)
1.首先打开命令行,切换到root身份,获得最新的软件包 su root sudo apt-get install update 2.安装MySQL数据库 sudo apt-get install m ...
- 【转】分享一份C语言写的简历
个人观点:文章想法很棒,作者的编码风格也很赞,可以从中学到不少东西.转载的文章是我都用心看过的,而且希望后续再可以回过头看的文章,努力让自己的能力越来越强,加油 这里黑客新闻吗?作者用代码更新了自己的 ...