美文网首页
iOS项目组件化之Cocoapods(二) -- 踩坑与小技巧

iOS项目组件化之Cocoapods(二) -- 踩坑与小技巧

作者: 普通上班族老王 | 来源:发表于2019-02-15 17:22 被阅读0次

    前言

    该篇介绍在组件化中遇到的一些坑和一些小技巧使用方面.

    系列文章

    iOS项目组件化之Cocoapods(一) -- 基础
    iOS项目组件化之Cocoapods(二) -- 踩坑与小技巧


    静态库多类型资源文件问题

    静态库主要坑之一就是多类型资源文件问题. 当时就为了这个查了很久 (╯‵□′)╯︵┻━┻
    当你设podspec为:

    s.static_framework = true
    

    这时候就会存在只能加载一种类型文件问题, 下面我用实例来演示给大家看.

    库结构

    我们先看看库文件


    在这里插入图片描述

    代码运行

    两个库, 一个是动态库, 一个是静态库. 资源文件都是放了一个xib和一张图片.(Swift和OC没啥差别)
    接下来看看主项目里面代码的调用, 并且运行一下.
    [图片上传失败...(image-a700f6-1550222540017)]从日志中, 我们可以看到, 动态库和静态库

    勾选Inherit Module From Target

    这里要注意一点, xib中必须要勾选Inherit Module From Target 指定在哪个模组
    不然你运行会和静态库一样, 出现 Unknown class xxx in Interface Builder file.


    在这里插入图片描述

    解决静态库使用多类型资源文件问题

    其实这个很好解决, 只要把静态库需要用的资源分离出来,创建一个资源库, 然后静态库的podspec里面关联这个资源库. 这样就能静态库使用多类型资源问题了.
    最后这个我就不演示了, 留给大家自己去实践, 有啥问题可以留个评论~


    App Extension 被限制问题

    'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based solutions where appropriate instead.
    这个错误是因为你用AppExtension的'sharedApplication'就已经是在调用系统层的东西了, 所以苹果是不会让你取这个的.
    所以App Extension里面用的库一定要注意, 不要涉及到这些系统禁用的东西.


    The 'Pods-xxx' target has transitive dependencies that include static binaries:

    出现这个错误时, 在podspec中加入. 具体原因我也没去了解, 知道的大哥可以在评论中解释一下.

    Pod::Spec.new do |s|
      pre_install do |installer|Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {
          
      }
      end
    end
    

    小技巧

    项目配置

    在这里我列出最常用的两个吧( 反正是我最常用✧(≖ ◡ ≖) )
    这个属性还可以配置很多, 具体可以去官网查, 或者Google一下.
    ps: ENABLE_BITCODE 这些字段, 可以右击 xxx.xcodeproj, 点击显示包内容, 打开project.pbxproj文件查看字段( 这个文件很有用,有兴趣可以深入了解一下 )

    s.pod_target_xcconfig = {
        'ENABLE_BITCODE' => 'NO', #配置Bitcode为NO
        'ENABLE_TESTABILITY' => 'NO', #配置enable testability为NO
    }
    

    分模块

    其实按目前的教程, 如果直接这样发布到Cocoapods上面, 或者指定git依赖等等.
    会发现文件的位置并不会分文件夹, 而是全部在一个目录下, 这样就会特别不清晰, 这个时候就需要用到 .subspec 字段了.

    Pod::Spec.new do |s|
    
    # s 是上面 do |s| 声明的 s, 类似声明一个对象
        s.subspec 'Tool' do |tool|
        # Tool是文件夹名, tool是这个组的对象.
        
            tool.subspec 'UITool' do |uiTool|
            # 如果还需要细分, 那么就一直这样下去就行
            end
            
        end
        
    end
    

    而且人家单独想用你某个subspec还可以这样pod

    pod 'xxx/Tool'
    

    这样分不单单层次分明而已, 例如一些老项目是有MRC文件, 然后你只需要把MRC文件放到一个文件夹,其他ARC放到另一个文件夹,这样就能通过每个不同的subspec来设置.
    还有很多用法,这里只是抛转引玉.


    项目地址

    照惯例, 提供项目地址
    https://github.com/SyKingW/XQTestCocoapodsModule(2)

    相关文章

      网友评论

          本文标题:iOS项目组件化之Cocoapods(二) -- 踩坑与小技巧

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