十、资源文件 .buldle
的添加
- 10.1、什么是Bundle文件?
答:简单理解,就是资源文件包。我们将许多图片、XIB、文本文件组织在一起,打包成一个Bundle文件。方便在其他项目中引用包内的资源。
- 10.2、Bundle文件的特点?
答:Bundle是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的2进制数据。
- 10.3、bundle的优点
- (1)、因为bundle在目录结构中的层次结构,一个bundle只包含资源文件。因此,你可以使用相同的文件接口像打开其他类型文件一样打开bundle文件
- (2)、bundle的结构使它可以很容易的支持本地化,你可以非常容易的添加或者移除本地资源
- (3)、bundle可以保持在多种格式的的系统中, 如HFS,HFS+和AFP的multiple fork formats;UFS,SMB,NFS 的single-fork formats
- 10.4、我们创建一个
JKCIOBase.bundle
的资源文件
- <1>、新建一个工程macOS的Bundle项目
<2>、命名为:JKCIOBase.bundle
<3>、删除文件夹和info.plist文件
<4>、删除Build Settings里的Packaging的info.plist的文件地址
<5>、设置 Base SDK 为 iOS
- <6>、把
Build Active Architecture Only
修改为NO
,否则生成的库就只支持当前选择设备的架构
- <7>、bundle中的图片格式修改
iOS 创建Bundle时放入的图片资源(.png)在默认配置下会被转为.tiff格式,使用的时候找不到。因为在iOS中创建bundle时会用一个“hack”,为了使所有的运行需要更改一个配置。找到bundle的工程,修改:
<8>.可选配置
作为资源包,仅仅需要编译就好,无需安装相关的配置,设置 Skip Install
为 YES
,清除 Installation Directory
路径信息。
<9>、最关键是把工程目录下的Build Settings
下Code Signing Identity
的苹果研发者证书换成 iOS研发者证书
<10>.添加要打包的资源文件进到文件夹,编译
<11>、进入到 JKCIOBase.bundle
<12>、把JKCIOBase.bundle
复制到其他的iOS项目
- <13>、图片的使用
- 第一种直接拖入项目使用,取路径如下
- OC
"JKCIOBase.bundle/icon_scan"
- 加载图片
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 40, 40)]; imageView.image = [UIImage imageNamed:@"JKCIOBase.bundle/icon_scan"] [self.view addSubview:imageView];
- Swift
let path = Bundle.init(for: ViewController.self).path(forResource: "Frameworks/xcrbasekit.framework/xcrbasekit", ofType: "bundle") let bundle = Bundle.init(path: path!) let image = UIImage.init(named: "xbb_bigV", in: bundle, compatibleWith: nil) let userImageView = UIImageView(frame: CGRect(x: 100, y: 100, width: 100, height: 100)) userImageView.image = image view.addSubview(userImageView)
- 对于上面参数的理解
let path = Bundle.init(for: #className.self).path(forResource: "#bunleName", ofType: "bundle") let bundle = Bundle.init(path: path!) let image = UIImage.init(named: "#pageName", in: bundle, compatibleWith: nil)
- className:bundle所在的类的类名
bunleName:bundle名称
pageName:要使用的图片名称
- 第二种封装成SDK再使用,取路径如下
- OC
"Frameworks/JKOCProjectTool.framework/JKCIOBase.bundle/icon_scan"
- 加载图片
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 40, 40)]; imageView.image = [UIImage imageNamed:@"Frameworks/JKOCProjectTool.framework/JKCIOBase.bundle/icon_scan"] [self.view addSubview:imageView];
- Swift,取资源调用
<14>
里面的函数
let userImageView = UIImageView(frame: CGRect(x: 100, y: 100, width: 100, height: 100)) userImageView.image = UIImage(named: getBundleResource(bundName: "xcrbasekit", resourceName: "xbb_bigV", bundleType: 1)) view.addSubview(userImageView)
- <14>、把图片路径封装成宏
- OC
#define JKOCProjectToolBundlePath(file) [@"JKOCProjectTool.bundle" stringByAppendingPathComponent:file] #define JKOCProjectToolFrameworkBundlePath(file) [@"Frameworks/JKOCProjectTool.framework/JKOCProjectTool.bundle" stringByAppendingPathComponent:file] #define JKOCProjectToolBundleImageName(file) [UIImage imageNamed:JKOCProjectToolBundlePath(file)] ? :[UIImage imageNamed:JKOCProjectToolFrameworkBundlePath(file)]
- Swift 写成函数
/// 获取资源文件 /// - Parameter bundName: bundle的名字 /// - Parameter resourceName: 资源的名字,比如图片的名字 /// - Parameter bundleType: 类型:默认 0 是在自己模块下使用,1 在其他模块中使用 func getBundleResource(bundName: String,resourceName: String,bundleType: Int = 0) -> String { if bundleType == 1 { return "Frameworks/\(bundName).framework/\(bundName).bundle/\(resourceName)" } return "\(bundName).bundle/" + "\(resourceName)" }
十一、远程私有库内容更新
远程私有库内容更新的更新其实和八
里面一样的步骤,修改JKCIOBase里面的内容,更改spec内的版本号,有要修改的就修改内容,打版本tag,提交tag到远程私有仓库,提交spec文件打破本地spec仓库与远程私有spec检索仓库
十二、fastlane 自动化更新pod库
- 12.1、什么是自动化?
答:通过简单的一条命令, 去自动执行一组固定操作,比如:测试、打包上传审核、分发 等自动化使用场景
- 12.2、Fastlane 简介
Fastlane是一个ruby脚本集合
- 12.3、Fastlane使用概念
lane
(航道) : 好比一道题Action
机制:好比做一道题分很多步,每一步都是一个 Action,专业的解释:Action是Fastlane自动化流程中的最小执行单元,体现在Fastfile脚本中的一个个命令,比如:cocoapods
、git_add
等等,而这些命令背后都对应一个用Ruby
编写的脚本。
- 目前所有的 Action: Actions描述链接、源码链接
- 常用action:
produce
创建可用于 iTunes Connect 和 Apple Developer Portal 的 iOS app。cert
自动创建和维护 iOS 代码签名证书。sigh
创建、更新、下载和修复 provisioning profiles。snapshot
自动将 App 屏幕截图本地化到每种设备上。frameit
将屏幕截图适配到适当的设备屏幕大小。gym
创建和打包 iOS app。deliver
上传屏幕截图、元数据和 App 到 App 商店。PEM
自动创建和更新 Push 通知的 profile。
- 12.4、Fastlane 安装
sudo gem install fastlane sudo gem install -n /usr/local/bin fastlane
提示:要求ruby版本最新
brew update brew install ruby
- 提示:如果报错:
-bash: brew: command not found
- 解决上面报错的方法:mac 终端下,执行以下命令,即可安装brew:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 在终端环境下,
brew --version
查看brew的版本,也可以验证brew是否安装成功
- 12.5、在项目使用 Fastlane
- <1>、在终端 cd 进入项目根目录
- <2>、
fastlane init
- (1)、📸自动截图
- (2)、👩✈️自动测试分发到TestFlight
- (3)、🚀自动化App Store分发
- (4)、🛠手动设置 - 手动设置项目以自动执行任务
提示1:看自己的需求,我这里选的4
提示2:如果不需要实现上传等操作, 其实我们可以直接在工程目录下, 创建一个
fastlane
文件夹, 在文件夹内部创建"使用文件"(Fastfile
文件),在成功后fastlane
文件夹里面会有一个Fastfile
文件
- <3>、 在fastlane 文件夹里面的 Fastfile 文件中, 描述不同的"航道",我们这里以下面的步骤为主
提示:在代码转化为 action的过程都是在 Actions描述 里面查找的
- (1)、提交代码到本地暂缓区,
git add .
,对应的fastlane 命令如下
git_add(path: ".")
提示:
.
代表当前文件下所有的内容
- (2)、提交代码到本地仓库,
git commit -m '提交内容说明'
,对应的fastlane 命令如下,提交说明的信息,我们可以定义成参数传进来
git_commit(path: ".", message: "提交代码")
- (3)、提交代码到远程仓库,
git push origin master
,对应的fastlane 命令如下
push_to_git_remote
- (4)、给版本打tag,
git tag 版本号
,对应的fastlane 命令如下
add_git_tag( tag: 版本号 )
提示:版本号我们传进来
- (5)、提交所有的版本
git push --tags
,对应的fastlane 命令如下
push_git_tags
- (6)、删除指定tag: 本地删除
git tag -d 0.0.1
,远程删除:git push origin :0.0.1
,对应的fastlane 命令如下
remove_tag(tag:版本号)
- (6)、验证spec文件是否有报错,允许有警告,
pod spec lint --allow-warnings
,对应的fastlane 命令如下
pod_lib_lint(allow_warnings: true)
- (7)、如果你在验证的时候有警告,只要没有报错可以加上 --use-libraries --allow-warnings就可以提交:
pod repo push 本地私有库名 组件名.podspec --use-libraries --allow-warnings
,,对应的 fastlane 命令如下
pod_push(path: "#{组件名}.podspec", repo: "本地库名", allow_warnings: true)
- (8)、
pod install
对应的 fastlane 命令如下
cocoapods( clean: true, podfile: "." )
提示:podfile后面的路径是以 fastlane文件夹为准需要 Podfile 文件的,如果Podfile与fastlane文件夹同目录,那么就写:podfile: ".",其中
.
代表当前目录
- 12.6、fastlane文件夹下Fastfile文件的命令完整的步骤如下:
default_platform(:ios) platform :ios do desc "pod远程提交" lane :custom_lane do |options| # 参数一:提交代码的备注 commit_message = options[:message] # 参数二:版本号 commit_tagName = options[:tagName] # 参数三:spec 文件的名字 commit_specName = options[:specName] # 参数四:仓库的本地检索库的名字 commit_repositoryName = options[:repositoryName] # 1、提交代码到本地暂缓区 git_add(path: ".") # 2、提交代码到本地仓库 git_commit(path: ".", message: "#{commit_message}") # 3、提交代码到远程仓库 push_to_git_remote # 4、验证tag是否存在,如果存在, 应该删除本地标签和远程标签 # 如果判断标签是否存在 if git_tag_exists(tag: commit_tagName) UI.message("发现tag:#{commit_tagName} 已经存在, 即将执行, 删除动作 🚀") # 执行删除本地/远程标签 remove_tag(tag:commit_tagName) end # 5. git tag 标签名称 add_git_tag( tag: commit_tagName ) # 6. 提交tag到服务器 git push --tags push_git_tags # 7. 验证spec文件是否有问题 pod_lib_lint(allow_warnings: true) # 8. 推送 spec 文件到本地和服务器 pod_push(path: "#{commit_specName}.podspec", repo: "#{commit_repositoryName}", allow_warnings: true) end end
- 使用方式:把fastlane文件夹拖到和spec文件同一目录下,cd 进入 spec 文件所在的目录,执行下面的命令
命令: fastlane custom_lane message:提交内容说明 tagName: 版本号 specName: spec文件名字 repositoryName: 仓库名字
提示:一定要有 fastlane文件夹,里面有Fastfile文件
十三、其他组内成员如何使用?
- 13.1、分配权限给同事
把创建的远程代码私有库以及远程spec私有库都添加你同事进来,让他注册码云账号,添加这两个远程私有库 - 13.2、添加本地私有库
重复一 里面的 1.2
在本地添加一个spec仓库 - 13.3、配置Podfile文件