美文网首页
framework操作及制作podfile引入

framework操作及制作podfile引入

作者: 独孤流 | 来源:发表于2022-04-07 01:40 被阅读0次

    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 <angled> 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引入

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