美文网首页
iOS 非公开库改造为可通过CocoaPods集成

iOS 非公开库改造为可通过CocoaPods集成

作者: 野生塔塔酱 | 来源:发表于2021-07-16 13:45 被阅读0次

    前言

    一般而言,SDK会做成CocoaPods公开库的方式以方便客户直接集成。但有时候根据公司规定,不准备提供Git或者SVN公开库的形式,只允许放在自己的文件服务器上。
    此时,如遇到客户要求通过CocoaPods直接集成而不想通过拖拽SDK包进项目时,可进行此改造。
    改造的核心思路为
    1.Podfile文件中可通过如下形式指定一个podspec文件地址来集成一个库
    pod 'sdkName', :podspec => 'xxx/yyy.podspec'
    2.Podspec可以通过如下形式指定一个zip文件地址来拉取库
    详情可以参考CocoaPods官方文档source参数例子
    s.source = { 'http':'xxx/sdk.zip'} 或者 s.source = { :http => 'xxx/sdk.zip'}

    ZIP样例

    image.png

    SDKRootFolder:SDK打包好后存放的根目录。
    SDK-frame:次级目录,里面存放SDK内容。根据存放习惯也可能没有次级目录直接把SDK存放于根目录。
    Lib:SDK的一些依赖
    Resource:SDK的资源文件
    SDK.framework:SDK打包好的framework

    上传至文件服务器的ZIP包即为SDKRootFolder.zip

    此处的目录结构并非严格要求,只是在此举例。 目录结构就保留旧有SDK打包结果即可,重点是之后的Podspec内容填写,需要与自己的SDK目录结构对应起来。

    Podspec样例

    本样例按照上一节ZIP样例打包后的结果为参照

    #
    # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
    # Run `pod lib lint SDKName' to validate before publishing.
    #
    Pod::Spec.new do |s|
      s.name             = 'SDKName' #此处内容会填写在Podfile中Pod之后的部分
      s.version          = '0.0.1'
      s.summary          = 'A'
      s.description      = <<-DESC
    A.
                           DESC
      s.homepage         = 'http://example.com'
      s.license          = "MIT"
      s.author           = { 'Your Company' => 'email@example.com' }
      s.source           = { 'http':'xxx/SDKRootFolder.zip'} 
    #xxx部分即为存放在文件服务器上的路径
    
      s.source_files = 'SDKRootFolder/SDK-frame/Lib/**/*.{h,m,mm,d}' 
    #通过zip拉取的形式,所有路径必须加上根路径(即压缩包文件名那一层),下同。
    #s.source_files 指定需要导入项目的依赖路径
    
      s.static_framework = true
      s.platform = :ios, '8.0'
    
      s.resources     = "SDKRootFolder/SDK-frame/Resource/*.{xib,bundle,nib}", "SDKRootFolder/SDK-frame/Lib/**/*.{bundle}"
    #s.resources 指定需要导入项目的资源文件路径
    
      s.vendored_libraries = "SDKRootFolder/SDK-frame/Lib/**/*.a"
    #s.vendored_libraries 指定需要导入项目的.a文件路径
    
      s.vendored_frameworks = "SDKRootFolder/SDK-frame/SDK.framework"
    #s.vendored_frameworks 指定SDK打包好的frameworks路径
    
      s.frameworks = "AVFoundation", "CoreAudio"
      s.libraries  = "stdc++"
    
      s.dependency 'ReactiveObjC', '~> 3.0.0'
      s.dependency 'Masonry', '~> 1.0.2'
      s.dependency 'FMDB', '~> 2.6.2'
      s.dependency 'SDWebImage', '~> 5.10.0'
     #SDK需要的其他公开库依赖
    end
    
    

    使用方式

    1.将打包好的ZIP存放至文件服务器。
    比如
    ZIP:http://www.abc.com/SDKPath/SDKRootFolder.zip
    2.将Podspec中s.source修改为ZIP存放路径后存放至文件服务器
    s.source = { 'http':'http://www.abc.com/SDKPath/SDKRootFolder.zip'}
    Podspec: http://www.abc.com/PodspecPath/podspecName.podspec
    3.在Podfile中填写pod指令
    pod 'SDKName', :podspec => 'http://www.abc.com/PodspecPath/podspecName.podspec'
    pod 'SDKName'这部分取决于podspec文件中s.name的内容。
    4.运行pod install
    运行指令后CocoaPods会进行如下流程
    (1)根据pod 'SDKName', :podspec =>填写的路径去访问podspec文件
    (2)根据podspec文件中填写的s.dependency、s.frameworks、s.libraries拉取和添加相关依赖库
    (3)根据podspec文件中s.source填写的地址去下载zip文件并解压
    (4)根据podspec文件中s.source_files等填写地址将解压结果中的对应内容添加到项目中

    至此就达到不用给客户发SDK包,只需要给一个Podspec地址就可以让客户通过CocoaPods集成SDK的目的。

    常见问题

    1.pod install后报错
    [!] The name of the given podspec xxx doesn't match the expected one yyy
    问题原因
    pod 'SDKName', :podspec => 'http://www.abc.com/PodspecPath/podspecName.podspec'
    'SDKName'与对应'http://www.abc.com/PodspecPath/podspecName.podspec's.name不一致

    2.pod install成功,但是pods文件夹下SDK对应文件夹下内容为空或者缺少某些文件
    问题原因
    podspec中s.source_files、s.resources等的路径填写有误。路径填写需要从zip文件名层级开始填写。
    如路径无误,检查诸如以下通配符的填写是否有问题。
    Lib/**/*.{h,m,mm,d}代表Lib文件夹下的所有文件夹内的指定类型(大括号内指定)文件如Lib/a/b.h
    Lib/*.{h,m,mm,d}代表Lib文件夹下的所有指定类型(大括号内指定)文件如Lib/b.h

    相关文章

      网友评论

          本文标题:iOS 非公开库改造为可通过CocoaPods集成

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