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

一、拉取团队的项目后,运行提示无权限

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管理本地私有库遇到的问题)