一、拉取团队的项目后,运行提示无权限
The file couldn't be opened because you don't have permission to view it
点击pod中的类,得到如下提示
可以尝试以下几个方案:
(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文件(上级目录可以看出是真机还是模拟器文件夹),真机和模拟器运行成功的文件是在这俩个文件夹内的。
网友评论