framework操作及制作podfile引入

IOS 逆向开发(四)App重签名
XCFramework制作
如何辨别.framework是动态库还是静态库
lipo 命令的基本用法
一个工程多个target引入CocoaPods的方式
美团 iOS 工程 zsource 命令背后的那些事儿
iOS美团同款"ZSource"二进制调试实现
https://github.com/MeetYouDevs/cocoapods-imy-bin
cocoapods-binary工作原理及改进
Ruby和Cocoapods文章合集
iOS Pod 'xxx.h' file not found with include; use "quotes" instead
由 Pod 导致的 File not found
Cocoapods整理(三)——编写podspec文件

完整demo:https://github.com/eye1234456/podframwork.git

1、查看签名及重签名:

查看app的签名:
codesign -vv -d xxx.app
查看 某个库的签名(同时可以查看某个库支持的架构):
codesign -vv -d xxx.framework
查看电脑安装好的所有证书:
security find-identity -v -p codesigning
对某个库进行重签名:
codesign -fs "Apple Development: xxx (xxx)" xxx.framework

2、查看是动态库还是静态库:

file xxx.framework/xxx

3、查看支持的架构:

查看支持的架构:
lipo -info xxx.framework/xxx
删除指定的架构(如x86_64,导出后的库会自动删除签名信息):

lipo -remove x86_64 \ 
xxx.framework/xxx \ 
-output xxx.framework/xxx

合并几个架构(比如把模拟器的x86_64与真机的arm64合并成一个,可以一个framework同时支持真机和模拟器,导出后的库会自动删除签名信息,但是会增加包的体积)

lipo -create  xxx.framework/xxx  \ 
yyy.framework/yyy \ 
-output zzz.framework/zzz

4、将多个framework库合并成xcframework:

xcode可以会在编译时选择xcframework中实际需要的架构编译进包中,这种方式可以减少包的体积还能一个xcframework同时支持真机与模拟器运行

xcodebuild -create-xcframework \
-framework xxx.framework \
-framework yyy.framework \
-output zzz.xcframework

二、xcode创建framework及制作framework的pod私有库:

动态framework由于必须要签名,如果framework与主app的签名不一致会导致报签名错误,所以尽量使用pod的方式引入就不会有签名问题

1、在xcode创建framwork的工程
2、然后再创建Podfile将framwork的源码使用pod的方式依赖三方库
2.1 如果podfile里use_frameworks!是打开的,

则编译后创建的framwork依赖的三方使用的是动态库的方式,也就是说依赖的三方库不会被打包到framework里,需要在后续编写podspec文件时增加s.dependency 'AFNetworking'这种内容,如果不加入这种依赖,则会在运行时报找不到某些依赖库的错

2.2 如果podfile里use_frameworks!是注释掉的或者没有这一句,

则编译后创建的framwork依赖的三方使用的是静态库的方式,也就是说依赖的三方库会被直接打包到framework里,如果主app也依赖了相同的一些三方库,可能会有一些莫名其妙的错

3、创建xxx.podspec注意事项
1、这个文件必须在git仓库下的第一级目录
2、xxx.podspec的名字需要跟文件里的s.name = 'xxx'一致,这个名字也是在主app里pod 'xxx‘的名字
3、指定的framwork的方式

s.vendored_frameworks = [
 'xxx.framework',
 'yyy.xcframework'
]

4、指定依赖的三方库:

s.dependency 'AFNetworking', 
s.dependency 'ReactiveObjC'

三、framwork源码调试


四、多target的podfile的配法:

方式一:通过 abstract 方式引入

#targetA: [AFNetworking,Masonry]
#targetB:[AFNetworking,SDWebImage]
abstract_target 'abstract_pod' do  #这里的abstract_pod在实际targets中不存在,是虚拟
    pod 'AFNetworking'

    target 'targetA' do
        pod 'Masonry'
    end

    target 'targetB' do
        pod 'SDWebImage'
    end
end

方式二:循环 target 添加 pod

#多个target的pod引入,方式一:如每个pod都引入masonry
targetArray = ['target1','target2']
targetArray.each do |t|
    target t do
        pod 'Masonry', '~> 1.1.0'
    end
end

方式三:提取公共 pods 各个 target 引入

#多个target的pod引入,方式二:如每个pod都引入masonry
def commonPods
    pod 'Masonry', '~> 1.1.0'
end

#工程一:
target 'AnyDoorDemo' do
    commonPods
    pod 'AFNetworking', '~> 3.2.1'
target 'AnyDoorDemoTests' do
    inherit! :search_paths
    pod 'Specta', '~> 1.0.7'
    pod 'OCMock', '~> 3.4.2'
    pod 'Expecta', '~> 1.0.6'
end

  target 'AnyDoorDemoUITests' do
    inherit! :search_paths
    # Pods for testing
  end
end

#工程二:
target 'HostApp' do
    commonPods
end

iOS Pod 'xxx.h' file not found with include; use "quotes" instead
好好的<>非要让你改成"",不然就报错给你看 T T
分析:

Header Search Paths中未配置对应路径。可能是.podspec文件中的“dependencies”未配置对应的依赖,导致对应依赖库的路径没有写入编译项目的“Header Search Paths”内

解决方法:

方法一:
项目->PROJECT->项目xxx->Info->Configurations->Debug->项目xxx->targetXXX->Pods-xxx.debug
能改成这个最好,如果有自定义的config,在定义的config里引入Pods-xxx.debug

// 自定义的xxx-debug.xcconfig里
#include "Pods/Target Support Files/Pods-xxx/Pods-xxx.debug.xcconfig"

方法二:
修改 Header Search Path
添加 $(PODS_ROOT) 选择 recursive
添加 $(SRCROOT) 选择 recursive
Build

你可能感兴趣的:(framework操作及制作podfile引入)