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
由 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