在 podspec 中,利用 source_files 可以指定要编译的源代码文件。可是,当我们需要把图片、音频、NIB等资源打包进 Pod 时该怎么办呢?

1.如何把资源文件打包为.bundle文件?

通常我们都会用.bundle文件把资源文件打包,这里也一样,把你的图片、音频、NIB等资源文件先统一放在一个文件夹里,文件夹名称最好是你的组件名称加上bundle,然后修改文件夹后缀为.bundle,就得到了一个bundle文件;然后把.bundle文件放在与Classes同一级的文件夹下,如下图

2.如何在podspec文件里配置资源路径?

然后在podspec文件里通过s.resource指定你的资源文件路径,如果你的组件名称叫ICXMeumAssistant,那么你的bundle名称就可以叫ICXIntelligentAssistantBundle.bundle

在podspec文件里配置:

p.p1 { margin: 0; font: 11px Menlo; color: rgba(39, 42, 216, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { color: rgba(0, 0, 0, 1) }

  s.resource     = 'ICXMeumAssistant/ICXIntelligentAssistantBundle.bundle'
 
Pod::Spec.new do |s|
s.name = 'ICXMeumAssistant'
s.version = '0.1.2'
s.summary = '将管家模块代码抽取成组件.'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC s.homepage = 'https://git.icarbonx.com/ICX-iOS/ICXMeumAssistant'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { ' 吕佳珍' => 'lvjiazhen@icarbonx.com' }
s.source = { :git => 'https://git.icarbonx.com/ICX-iOS/ICXMeumAssistant.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.source_files = 'ICXMeumAssistant/Classes/**/*'
s.resource = 'ICXMeumAssistant/ICXIntelligentAssistantBundle.bundle' s.dependency 'MJExtension'
s.dependency 'KILabel'
s.dependency 'MJRefresh'
s.dependency 'SDWebImage'
s.dependency 'Masonry'
s.dependency 'ICXPublicMarcoFile'
s.dependency 'ICXPublicCategory'
s.dependency 'ICXPublicTools'
s.dependency 'ICXMBProgressHUDExtension'
s.dependency 'TYAudio2WordsManager'
s.dependency 'ICXUserInfoModule'
s.dependency 'ICXWebViewModule'
s.dependency 'ICX10Clock'
end

3.如何读取bundle里面的资源?

首先我们需要获取bundle,你是不是立即想到了NSBundle mainBundle ? 但是当你的 pod 库以 framework 形式被使用时,你的资源不是被拷贝到 mainBundle 下,而是被放到 pod 的最终产物—— framework里。此时,你必须保证自己在访问这个 framework 的 bundle,而不是主工程的。

我创建了一个NSBundle的类别文件

先获取framework 的 bundle,ICXMeumAssistantBundleClass是组件里的一个类文件:

p.p1 { margin: 0; font: 11px Menlo; color: rgba(79, 129, 135, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { color: rgba(0, 0, 0, 1) }
span.s2 { color: rgba(112, 61, 170, 1) }
span.s3 { color: rgba(62, 30, 129, 1) }

+ (NSURL *)ma_AssistantLibraryBundleURL {
//先获取framework 的 bundle
NSBundle *bundle = [NSBundle bundleForClass:[ICXMeumAssistantBundleClass class]];
return [bundle URLForResource:@"ICXIntelligentAssistantBundle" withExtension:@"bundle"];
}

然后再获取我们自己手动创建的bundle:

+ (instancetype) ma_AssistantBundle {
//再获取我们自己手动创建的bundle
return [self bundleWithURL:[self ma_AssistantLibraryBundleURL]];
}

获取到了我们存放资源文件的bundle文件以后,就可以访问资源文件了,比如获取名为imageName的图片:

+ (UIImage *)ma_AssistantImageNamed:(NSString *)imageName
{
UIImage *loadingImage = [[UIImage imageWithContentsOfFile:[[self ma_AssistantBundle] pathForResource:[NSString stringWithFormat:@"%@@2x",imageName] ofType:@"png"]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
return loadingImage;
}

p.p1 { margin: 0; font: 11px Menlo; color: rgba(62, 30, 129, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { color: rgba(0, 0, 0, 1) }
span.s2 { color: rgba(112, 61, 170, 1) }
span.s3 { color: rgba(186, 45, 162, 1) }
span.s4 { color: rgba(49, 89, 93, 1) }
span.s5 { color: rgba(209, 47, 27, 1) }

加载xib文件需要注意的是当你只是把xib文件放到.bundle文件里的话,那么加载xib文件就会一直报异常:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/adminuser/Library/Developer/CoreSimulator/Devices/464AB3F8-3C31-4473-AD1B-F554F3F59CDB/data/Containers/Bundle/Application/B4A5F964-A6E0-4357-878F-11A299FD1ACA/MyTestApp.app> (loaded)' with name 'TPDoctorIntroductionView'

这是因为.bundle文件里只放了xib文件,并没有nib文件,需要进行一下转化:
在终端输入以下命令进行转化:

p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { font-variant-ligatures: no-common-ligatures }

ibtool --errors --warnings --output-format human-readable-text --compile TPDoctorIntroductionView.nib TPDoctorIntroductionView.xib

如果提示你Xcode路径不对的话,再重置一下你的Xcode路径:

p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { font-variant-ligatures: no-common-ligatures }

sudo xcode-select -switch /Applications/Xcode9.3.app/Contents/Developer

转化以后,路径下就多了同名的nib文件,但我目前不知道如果有多个xib怎么能通过一句命令全部生成nib

然后加载xib文件就不会异常啦

+ (instancetype)doctorView{

    return [[NSBundle ma_AssistantBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil][0];
}  

  加载国际化文件

+ (NSString *)ma_AssistantLocalizedStringForKey:(NSString *)key
{
return [self ma_AssistantLocalizedStringForKey:key value:nil];
} + (NSString *)ma_AssistantLocalizedStringForKey:(NSString *)key value:(NSString *)value
{
static NSBundle *bundle = nil;
if (bundle == nil) {
// (iOS获取的语言字符串比较不稳定)目前框架只处理en、zh-Hans、zh-Hant三种情况,其他按照系统默认处理
NSString *language = [NSLocale preferredLanguages].firstObject;
if ([language hasPrefix:@"en"]) {
language = @"en";
} else if ([language hasPrefix:@"zh"]) {
if ([language rangeOfString:@"Hans"].location != NSNotFound) {
language = @"zh-Hans"; // 简体中文
} else { // zh-Hant\zh-HK\zh-TW
language = @"zh-Hant"; // 繁體中文
}
} else {
language = @"en";
} // 从.bundle中查找资源
bundle = [NSBundle bundleWithPath:[[NSBundle ma_AssistantBundle] pathForResource:language ofType:@"lproj"]];
}
value = [bundle localizedStringForKey:key value:value table:nil];
return value;
}

 PS:这里说的只是我个人习惯用的一种方式,其实还可以使用resource_bundles的方式,但道理都是相同的,尽可能避免跟主工程访问冲突 

 

p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }
p.p1 { margin: 0; font: 11px Menlo; color: rgba(79, 129, 135, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { color: rgba(0, 0, 0, 1) }
span.s2 { color: rgba(112, 61, 170, 1) }
span.s3 { color: rgba(62, 30, 129, 1) }
p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }
p.p1 { margin: 0; font: 11px Menlo; color: rgba(49, 89, 93, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { color: rgba(0, 0, 0, 1) }
span.s2 { color: rgba(186, 45, 162, 1) }
span.s3 { color: rgba(62, 30, 129, 1) }
p.p1 { margin: 0; font: 11px Menlo; color: rgba(209, 47, 27, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { color: rgba(0, 0, 0, 1) }
span.s2 { color: rgba(62, 30, 129, 1) }
p.p1 { margin: 0; font: 11px Menlo; color: rgba(112, 61, 170, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { color: rgba(0, 0, 0, 1) }
p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }

iOS组件化之-给自己的组件添加资源文件的更多相关文章

  1. 在WePY中实现了小程序的组件化开发,组件的所有业务与功能在组件本身实现,组件与组件之间彼此隔离,上述例子在WePY的组件化开发过程中,A组件只会影响到A所绑定的myclick

    wepyjs - 小程序组件化开发框架 https://tencent.github.io/wepy/document.html#/?id=%e5%be%ae%e4%bf%a1%e5%b0%8f%e7 ...

  2. 如何在IOS开发中在自己的framework中添加.bunble文件

    今天就跟大家介绍一下有关,如何在IOS开发中在自己的framework中添加.bunble文件,该文章我已经在IOS教程网(http://ios.662p.com)发布过来,个人觉得还是对大家有帮助的 ...

  3. vue.js原生组件化开发(一)——组件开发基础

    前言 vue作为一个轻量级前端框架,其核心就是组件化开发.我们一般常用的是用脚手架vue-cli来进行开发和管理,一个个组件即为一个个vue页面,这种叫单文件组件.我们在引用组件之时只需将组件页面引入 ...

  4. iOS组件化开发一pod库包含MRC的文件处理(五)

    在做项目的过程中,建立了一个私有pod库,在这个库中存在mrc类文件这个时候如果在使用了arc的工程中引用这个pod的工程中手动设置当然也可以就是费时费力.现在我们来看看如何在私有库配置文件里配置自动 ...

  5. Vue中组件化编码使用、实现组件之间的参数传递(实战练习二)

    上一章节实现的是静态页面的设计.这一章节实现将数据抽取出来.通过组件间参数的传递来实现 上一章节链接地址:https://blog.csdn.net/weixin_43304253/article/d ...

  6. 组件化CSS--管理你整站的CSS文件

    为什么要拆分样式文件? 更易于查找样式规则. 简化维护,方便管理. 还可以针对某一页面提供特定的样式. 为什么要添加桥接样式? 你可以随时添加或移除样式而不需要修改HTML 文档. 为什么要定义两种媒 ...

  7. DSAPI多功能组件编程应用-使用外部字体(包括资源文件)

    在软件开发过程中,尤其是比较个性化的程序,有时会需要使用非安装字体文件,比如发布的时候附带了一个专用字体,或者该字体文件直接被放入项目资源,当不希望把这个字体安装到用户的操作系统但又想使用它时,本示例 ...

  8. iOS组件化思路 <转>

    随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间的代码耦合,为了更好 ...

  9. iOS开发之组件化架构漫谈

    前段时间公司项目打算重构,准确来说应该是按之前的产品逻辑重写一个项目.在重构项目之前涉及到架构选型的问题,我和组里小伙伴一起研究了一下组件化架构,打算将项目重构为组件化架构.当然不是直接拿来照搬,还是 ...

随机推荐

  1. centos7 alias别名永久生效

    进入/etc/profile.d/目录 cd /etc/profile.d/ 在profile.d目录随意创建一个sh文件,例如alias_test.sh vi alias_test.sh##里面的内 ...

  2. SSRF漏洞用到的其他协议(dict协议,file协议)

    0x00 引言 当SSRF打内网reids时,若gopher协议用不了,我们也可以用其他协议 0x01 dict协议一.定义:词典网络协议,在RFC 2009中进行描述.它的目标是超越Webster ...

  3. 动态代理及java演示

    代理模式的理解     首先代理二字的含义,程序中代理与字面意思的代理并无区别.比如现实生活中办理车辆审车,我们经常会听说花钱找代理(又称黄牛)办手续,即办手续这个事,不是我们亲自执行,而是通过代理( ...

  4. 《剑指offer》面试题36. 二叉搜索树与双向链表

    问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜 ...

  5. rocketmq实现延迟队列精确到秒级实现方案2-时间轮和delay-file实现

    上图是通过RocketMQ源码分析一个实现原理方案示意图. 分为两个部分: 消息的写入消息的Schedule 在写入CommitLog之前,如果是延迟消息,按照每10分钟写入delayfile文件,对 ...

  6. 【刷题-LeetCode】199 Binary Tree Right Side View

    Binary Tree Right Side View Given a binary tree, imagine yourself standing on the right side of it, ...

  7. 【测试数据】android下CPU核与线程数的关系

    测试方法 24MB的一张4K图片,连续计算5次直方图. 小米mix2s, 高通骁龙 845.4大核,4小核. 数据表格 线程数 绝对时间(s) 累计CPU时间(s) 每线程平均耗时(us) 每线程最大 ...

  8. javascript的AMD规法--esl与requirejs浅介。

    AMD规范,全称是Asynchronous Module Definition,即异步模块加载机制.从它的规范描述页面看,AMD很短也很简单,但它却完整描述了模块的定义,依赖关系,引用关系以及加载机制 ...

  9. 树形dp空间优化(dfn)

    树形dp空间优化 介绍 有时题目会告诉我们n叉树的最大层数,或者给出一个完全n叉树树,直接做树形dp会爆空间时,就可以用这个优化方法. 多数树形dp都是先dfs到子树,再合并到根上,显然当合并到根上时 ...

  10. golang中数组指针和指针数组当做函数参数如何修改数组中的值

    先理解:数组指针它的类型时指针,指针数组它的类型时数组 1. 数组指针当做函数的参数 package main import "fmt" func changeData(dataA ...