美文网首页ios跨平台开发iOS备忘录
iOS 插件化开发汇总 Small框架

iOS 插件化开发汇总 Small框架

作者: Trowa | 来源:发表于2016-12-30 09:37 被阅读7513次

    应用插件化背景

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

    支付宝应用

    页上密密麻麻的功能,而且还在增多,照这个趋势发展下去,软件包的大小将会不可想象。目前常用的解决方案是使用web页面,但用户体验和Native界面是没法比的。

    设想,如果每一个功能点都是一个动态库,在用户想使用某个功能的时候让其从网络下载,然后手动加载动态库,实现功能的的插件化,就再也不用担心功能点的无限增多了,这该是件多么美好的事!

    软件版本实时模块升级

    还在忍受苹果动辄一周,甚至更长的审核周期吗?有了动态库妈妈就再也不用担心你的软件升级了!

    如果软件中的某个功能点出现了严重的bug,或者想在其中新增功能,你的这个功能点又是通过动态库实现的,这时候你只需要在适当的时候从服务器上将新版本的动态库文件下载到本地,然后在用户重启应用的时候即可实现新功能的展现。

    共享可执行文件

    在其它大部分平台上,动态库都可以用于不同应用间共享,这就大大节省了内存。从目前来看,iOS仍然不允许进程间共享动态库,即iOS上的动态库只能是私有的,因为我们仍然不能将动态库文件放置在除了自身沙盒以外的其它任何地方。

    不过iOS8上开放了App Extension功能,可以为一个应用创建插件,这样主app和插件之间共享动态库还是可行的。

    PS: 上述关于动态库在iOS平台的使用,在技术上都是可行的,但本人并没有真正尝试过做出一个上线AppStore的应用,因此并不保证按照上述方式使用动态库一定能通过苹果审核!

    模块化开发的优势:

    • 1、完美内置

    所有插件支持内置于宿主包中

    • 2、高度透明

    插件编码、布局编写方式与独立应用开发无异
    插件代码调试与整包开发无异

    • 3、极致裁剪

    对插件分离所有一切能分离的公共代码、资源

    • 4、无缝链接

    通过设定URI,宿主、本地化应用插件、本地化web插件、在线网页,以及任何自定义的插件之间能够相互调起与传递参数

    • 5、跨平台

    目前已支持Android、iOS以及html5插件。并且三者之间可以通过同一套Javascript接口进行通信。

    先看一下工程目录

    工程目录.png

    再来看一下效果图

    效果图

    入门

    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模板

    Small-pods Application.png
    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

    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

    用例

    • 使用者模式Sample

      需要先编译Pods

    • 开发者模式DevSample

      需要去除并行编译模式:Edit Scheme...->Build->Build Options-> 口 Parallelize Build (取消选中状态)

      各个组件需要签名后才支持代码级别更新。示例中更新例子为xib内容更新。

      在没有设置签名之前,请在模拟器上跑示例。

    参考文献

    Small--Git传送门
    WWDC2014之iOS使用动态库
    iOS使用small创建iOS工程目录
    Small用例

    相关文章

      网友评论

      • Self_Time:很棒的小插件,另外意义的一种热更新。
      • 大菠萝98123:现在还能上appstore么
      • 酷哥不回头看爆炸:可以做到动态下载模块吗?
        酷哥不回头看爆炸:@枫之舞_c170 没有,我看是ios实现不了的暂时。
        大菠萝98123:哥们你有在用么
      • 沐森iOS:关键就是签名过不去,但是可以用于发行内测版本,不过还是得需要知道发行商「PP助手之类的」的企业签名。PS:iOS9之后打开动态链接库的似乎也不行了
      • 神奇水滴:請問支持swift使用嗎
      • lvzhehappy:我用了pod库去多工程联编,发现加载的子模块工程的控制器完全无法使用,smbundle得到的控制器为什么会出现这种情况呢,请问您遇见过这种情况吗?
      • 4b55e454c499:高人,请问可以真机跑么,另外在企业开发者账号下没有限制吧?安全性限制什么的
      • 6153bead0689:能不能完整的来个iOS的教程!!!跪求!
      • lizhi_boy:热更新:smile:
      • 6054a4da381e:要是弄个iOS教程就好了,基本都是Android的文档
      • 9da5c41f2369:楼主,这个small现在可以上AppStore了吗?
        b201c4361c68:我也想问这个问题,总感觉跟热更新沾边的就不能通过审核
        6054a4da381e:要是弄个iOS教程就好了,基本都是Android的文档
        Trowa:AppStore 没有亲测
      • slimsallen:iOS 签名在哪设置呢 就是真机跑步起来

      本文标题:iOS 插件化开发汇总 Small框架

      本文链接:https://www.haomeiwen.com/subject/yjspvttx.html