美文网首页
利用cocopods管理本地私有库遇到的问题

利用cocopods管理本地私有库遇到的问题

作者: th先生 | 来源:发表于2020-04-07 14:54 被阅读0次
    一、拉取团队的项目后,运行提示无权限

    The file couldn't be opened because you don't have permission to view it
    点击pod中的类,得到如下提示

    WechatIMG4.png

    可以尝试以下几个方案:
    (1):清除缓存
    xcode->preferences->Derived Data .然后删除这个Derived Data文件夹
    再clean一下,然后再运行

    (2):从工程外导入文件时,有一个要注意的地方,


    WechatIMG5.png

    导入的文件会变蓝色


    WechatIMG6.png

    如果换一种方式导入


    WechatIMG7.png

    导入的文件为黄色


    WechatIMG8.png
    因为勾选folder references一栏,只是单纯有引用,但文件路径不明确,没有实际加入到工程中来,所以可能造成问题。

    (3):我的问题的解决方案
    打开设置,选择安全性与隐私,并按照下图操作:


    WechatIMG9.png
    二、项目中图片加载不出来,从接口中发现图片url为http

    xCode 配置允许HTTP请求

    info.plist里面增加:
    App Transport Security Settings 属性
    再在此属性内增加Allow Arbitrary Loads,并设置值为YES

    三、'libxml/tree.h' file not found

    pod本地私有库,需要依赖系统的library----> libxml2
    推荐使用方法1
    (1)在本地库的podspec中添加

    spec.libraries =  "xml2"
    spec.pod_target_xcconfig = {'HEADER_SEARCH_PATHS' => '${SDK_DIR}/usr/include/libxml2'}
    

    (2)手动添加引用
    首先检查
    我们要在Build Setting中搜索other linker,在这里面添加:
    若引用的libxml2.tbd,添加-lxml2
    若引用libz.dylib,则添加-lz
    然后,
    在本地私有库的Build Setting中搜索Header Search Paths,添加路径:
    ${SDK_DIR}/usr/include/libxml2
    这样做的缺陷是每次重新pod install,都需要重新手动添加。

    这里有一个细节,
    spec.pod_target_xcconfig设置的是当前库的Build Settings,这里对应的是本地私有库。
    spec.user_target_xcconfig设置的是project中的Build Settings,即在运行的target中的Build Settings。这个在Cocoapods的官网上不建议使用,官网说设置这个有可能会和工程中本身的设置造成冲突。

    四、CocoaPod出现target overrides the OTHER_LDFLAGS build setting defined in Pods/Target Support的解决方案

    利用cocopods管理多个三方库及本地库,pod install后报错

    [!] The `AllBlue [Debug]` target overrides the `OTHER_LDFLAGS` build setting defined in Pods/Target Support Files/Pods/Pods.debug.xcconfig. This can lead to problems with the CocoaPods installation
    
    Use the `$(inherited)` flag, or
    Remove the build settings from the target.
    

    意思就是target的设置覆盖了 pod的设置。

    解决方案:
    Build Settings -> Other linker flags 中添加$(inherited)

    五、关于本地私有库中图片的加载问题

    尽量将图片等资源打包成bundle文件, 这样有效的防止了资源文件命名的冲突, 引用方法
    可以尝试:

    NSBundle *bundle = [NSBundle bundleForClass:["pod中随意一个类" class]];
    NSURL *bundleURL = [bundle URLForResource:@"bundle文件名" withExtension:@"bundle"];
    NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];
    UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
    
    先拿到该pod下随意一个类的bundle(该bundle与资源文件是一个bundle), 
    再根据该bundle找到bundle资源文件的路径, 最后使用资源文件.
    

    另外可以hook imageNamed:方法

    六、引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。

    Targets选项下有Other linker flags的设置为 -ObjC

    下面逐个介绍3个常用参数:
    -ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中
    -all_load: 会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很 有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
    -force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载

    七、

    (1):如果一个本地库需要import其他库的头文件,
    需要设置其podspec中spec.dependency添加依赖,才能正确索引到。

    (2):pod中引入多个库,如果出现相同的类名,编译会报错,有冲突。
    pod库中不允许出现相同的类,需要更改类名,或者删除。但是,如果pod库中与target中同时包含相同的类,编译不报错。

    (3):利用cocopods导入三方库或者本地库,打包.a文件时,添加Public Headers是无法添加库中头文件的,只能添加target中的.h文件。

    八、制作.a

    1.创建新工程 Cocoa Touch Framework文件,第二个是静态库文件,也就是我们常说的.a文件。
    2.将自动生成的.h,.m文件删掉
    3.将所需文件加入静态库工程中。
    4.下面进行整个工程的配置:

           4.1、TARGETS - >Build Settings -> Architectures:添加 armv7s;
     增加armv7架构
           4.2、 "Build Active Architecture Only" 设置为 "NO"
    

    注:Build active Architecture Only为什么设置为NO?

    在目标设备上,执行设备对应的指令集。Build active Architecture Only 设置为YES,只会选择编译、链接对应的指令集,设置为NO时,会涵盖所有指令集,在必要的时候选择执行对应的指令集。所以一般在Debug时会选择设置为YES(效率会高点,虽然也没什么卵用),Release时会选择设置为NO,以支持所有可能的架构。

          4.3、"Mach-O Type" 设置为 "Static Library"  默认为动态库 ,苹果审核不通过。
          4.4、"iOS Deployment Target" 设置为 "iOS 9.0" ,这是支持最低运行iOS系统版本(可自行选择,但是要注意的是,iOS SDK中,已经废弃的方法,这个需要配合 Base SDK 设置)。
    

    5.下面我们将头文件(.h)暴露在外,实现文件(.m)隐藏起来,如下:

    TARGETS - >Build Settings -> Build Phases中,将Headers中的Project内的头文件拖到Public中。
    

    6.制作.a文件

    来到工程目录树,Products下的文件都是红色的,现在我们选中.a文件,分别真机和模拟器运行一遍(成功运行),然后Show in Finder 找到对应的 .a文件(上级目录可以看出是真机还是模拟器文件夹),真机和模拟器运行成功的文件是在这俩个文件夹内的。

    相关文章

      网友评论

          本文标题:利用cocopods管理本地私有库遇到的问题

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