组件化中遇到的问题--篇章一

如何依赖码云,创建私有库

快点我👉🏻:戳我告诉你怎么创建

基本名词

name:框架名
version:当前版本(注意,是当前版本,假如你后续更新了新版本,需要修改此处)
summary:简要描述,在pod search ZCPKit的时候会显示该信息。
description:详细描述
homepage:页面链接
license:开源协议
author:作者
source:源码git地址
platform:支持最低ios版本
source_files:源文件(可以包含.h和.m)
public_header_files:头文件(.h文件)
resources:资源文件(配置的文件都会被放到mainBundle中)
resource_bundles:资源文件(配置的文件会放到你自己指定的bundle中)
frameworks:依赖的.framework系统框架
libraries:依赖的.a系统库
vendored_frameworks:依赖的.framework非系统框架
vendored_libraries:依赖的.a非系统的静态库
dependency:依赖的三方库

spec 文件的基本认识

  • 私有库:指的是我们真正放置组件代码的地方。
  • 索引库:存放spec文件的地方,用于索引到代码的位置。
    打个比方,索引库就好比指针,私有库就好比对象,指针中存放了对象的地址,通过地址可以找到对象!
  • Podfile :项目依赖哪个 pod,以何种方式依赖,它的 podspec 放在哪里

spec 库引用问题

  • 模块怎么依赖其他pod
1
2
3
4
5
6
7
  // 这样就可以依赖了 
s.dependency 'ReactiveObjC'
s.dependency 'SDWebImage', '~> 3.7.2'
s.dependency 'MBProgressHUD', '~> 1.1.0'

// 不能这样写,这样写无效
s.dependency 'SDWebImage', 'MBProgressHUD'
  • 基础模块引用了自己打包的framework,开发测试时可以找到头文件,主工程引入却又找不到?
1
2
3
4
5
6
7
// 第一步:检测source_files, 如果是只包含 Classes文件下的.h,.m文件
s.source_files = 'ANEGBase/Classes/*.{h,m}'
// 改成下面:
s.source_files = 'ANEGBase/Classes/**/*'

// 第二步:引用自己或者第三方库,需要指定库的具体路径
s.vendored_frameworks = "ANEGBase/Classes/ANAppUtils.framework"
  • 本地私有库开发时,显示出良好的文件层划分,远程导入时,全部在一个文件夹里,而且很乱

使用subspec,在里面添加相应的ss.source_files、dependency

1
2
3
4
5
6
7
8
9
10
11
12
13
14
s.subspec 'ANCustomView' do |ss|
ss.source_files = 'ANEGBase/Classes/ANCustomView/*.h'
# 多层嵌套
ss.subspec 'ANLoadButton' do |sss|
sss.source_files = 'ANEGBase/Classes/ANCustomView/ ANLoadButton/*'

end
ss.subspec 'JKCountDownButton' do |sss|
sss.source_files = 'ANEGBase/Classes/ANCustomView/JKCountDownButton/*'
end
ss.subspec 'ANAppControls' do |sss|
sss.source_files = 'ANEGBase/Classes/ANCustomView/ANAppControls/*'
end
end
  • 当文件分层时,一个文件依赖另外一个文件的内容时
1
2
3
4
s.subspec 'ANTransition' do |ss|
ss.dependency 'ANEGBase/ANBase'
ss.source_files = 'ANEGBase/Classes/ANTransition/**'
end

图片

注意:依赖的时候写的路径并不是真是的物理路径,而是层及路径
例如ANBase 的真实物理路径: 'ANEGBase/Classes/ANBase/**.*',但是也要写成 ss.dependency 'ANEGBase/ANBase'

  • 【报错】 ERROR | [iOS] [ANEGBase/ANCustomView] file patterns: The source_files pattern did not match any file.

这个错误使用指令pod lib lint ANEGBase.podspec 检查文件是否合法时发生的。
是设置s.source_files时,路径不正确。这里的路径是相对于ANEGBase.podspec文件的,如果是与ANEGBase.podspec同级的文件夹, 直接写文件夹名称即可, 如:

1
source_files = ANTransition

如果是多级目录,必须要添加文件层级结构,如:

1
ss.source_files = 'ANEGBase/Classes/ANTransition/**'
  • spec 本地验证报错“non_modular_includes_in_framework_modules”

因为打包的framework使用了pod 引入了第三方,而将这个framework直接拖到项目中就会报这个错误,但是在xcode built-setting中可以关掉这个检测机制

而用cocoapods 就只能使用下面的方式了(在stackoverflow翻了好久)

1
s.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' }

怎么引用图片

引用图片是用bundle好,还是assest好?

  1. 使用s.resources
    1
    s.resources = ["Images/*.png", "Sounds/*"]

但是这些资源会在打包的时候直接拷贝的app的Bundle中,这样说不定会和其它资源产生命名冲突

  1. 将资源都放在bundle里,再使用s.resources
    1
    s.resource = "ANEGBase/Assets/ANAppUtils.bundle"

打包时候这个bundle会直接拷贝进appmainBundle中,所以使用的时候需要在mainBundle里面找这个bundle,然后再找资源。如:

1
2
3
NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"xxx" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];

  1. 使用s.resource_bundles
    1
    2
    3
    s.resource_bundles = {
    'ANAppUtils' => ['Resources/*.png'],
    'xxx' => ['xxx/*.png']

这种方法利用 framework 的命名空间,有效防止了资源冲突。
使用方法是先拿到最外面的 bundle,然后再去找下面指定名字 的 bundle 对象,再搜索具体资源。如:

1
2
3
4
5
6
// 查找当前文件所在的bundle包可以使用NSBundle类的+ (NSBundle *)bundleForClass:(Class)aClass;方法 

NSBundle *bundle = [NSBundle bundleForClass:[ANXXXClass class]];
NSURL *bundleURL = [bundle URLForResource:@"ANXXX" withExtension:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];
UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
  1. 将资源都放在assest里,使用s.resource_bundles
    1
    2
    3
      s.resource_bundles = {
    'ANEGBundleMudles' => ['ANEGBundleMudles/Assets/*']
    }

s.resource_bundles 是用来存放资源文件的,cocoapods 也支持了 Assets ,我们可以Assets管理图片
这种方法,在项目工程编译后,会出现在包的的 Frameworks/ANEGBundleMudles.framework/ANEGBundleMudles.bundle , 找到包右键show in finder

图片
因为是Assets管理,使用方式同第三步


xib资源怎么加载

待续

感谢您的阅读,本文由 Anrue 版权所有。如若转载,请注明出处:Anrue(https://github.com/anru1314/2018/10/31/iOS/2018-10-31-组件化中遇到的问题-篇章一/
常见图片格式
不可描述的 iOS 锁事