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

前言

一般而言,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 protected]' }
  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集成)