目录
项目在更新迭代的过程中,难免会有一些不再使用的图片,没有及时的删除。如果手动一个一个的搜,就太麻烦了。
本篇讲述使用脚本,查找每个图片名在Xcode中是否有引用,跟在Xcode中的全局查找差不多。
如果大家还不了解 ag,则可以通过这篇文章进行一个简单的了解:
一、Xcode中图片的引用方式
1、方式一:[UIImage imageNamed:@"imageName"]
2、方式二:在xib中使用,在xib中调用图片的方法是用xml的方式描述,图片资源作为image的名称,如下图:
3、方式三:for循环动态赋值
4、注意事项:
如果图片名称的命名不是很规范的话,可能会出现错误,即,明明图片被使用,搜索出来的结果却为空,例如,图片名命名为“首页-活动评价页(无回复)-箭头1”,这个图片名确实在工程中有引用,搜索出来的结果却为空,应该是 ag 的一个bug吧。
二、搜索的原理
搜索在项目中除了*.xcassets目录中的所有文件来跟该目录中的文件相匹配对应,如果找到对应的图片名称,说明该图片是被使用的,否则该图片没被使用,即可被清理掉。
三、使用 ag 查找图片
终端输入:ag "cancelVoice" /Users/admin/XMPP_TestDemo,搜索结果如下:
四、代码实现
1、对于动态赋值的图片的处理
我使用的方式是通过查找 “未标题-1_%@” 这个字符串来实现,如果有,说明 “未标题-1_0”、 “未标题-1_1” 图片被使用了。
2、注意
使用查找脚本之前,先复制一份工程,再进行操作,因为需要将 *.xcassets 进行路径变换,如果不进行变换,使用脚本在整个项目(包括xcassets目录)进行搜索的话,会导致所有的图片都被使用,无法找到未使用的图片。
3、源码
#! /usr/local/bin/python3
# -*- coding: UTF-8 -*-
# 寻找Xcode中不使用的图片
import glob
import os
import re
import shutil
# 正则表达式
# ignores = {r'image\d+'} 意思是以 image 开头的,image后面是数字的图片名的使用情况,例如能搜索到的图片是 image1、image2等等
# ignores = {r'(image | group)\d+'} 意思是以 image 或 group开头,后面跟数字的图片名,例如:image1、image2、group1、group2等等
def find_un_used():
img_names = [os.path.basename(pic)[:-9] for pic in images]
unused_imgs = []
for i in range(0, len(images)):
pic_name = img_names[i]
print("pic_name:",pic_name)
if pic_name == "code" or pic_name == "phone": # 跳过是因为会报错
continue
command = 'ag "%s" %s' % (pic_name, srcpath)
print("command是 ==== ",command)
# os.popen 执行bash命令, .read()读取执行的结果。
result = os.popen(command).read()
print("\n执行结果:",result,"\n")
if result == '':
if is_ignore(pic_name) == False: #判断是否是动态加载图片,True是动态加载,不删除
unused_imgs.append(images[i])
print ('remove %s' % (images[i]))
# 先不删除
# os.system('rm -rf %s' % (images[i])) # 直接执行bash命令
text_path = 'unused.txt'
tex = '\n'.join(sorted(unused_imgs))
os.system('echo "%s" > %s' % (tex, text_path))
print ('unuse res:%d' % (len(unused_imgs)))
print ('Done!')
def is_ignore(str):
ignore = str[:-1] # 将字符串 未标题-1_0、未标题-1_1 等,去掉最后数字,如果是2位数字的,可能会有问题。例如: 未标题-1_20、未标题-1_21,动态添加是把20整体变成不确定的数值
dynamicStr = ignore+'%d'
command = 'ag "%s" %s' % (dynamicStr, path)
print("is_ignore == command是 ==== ", command)
result = os.popen(command).read()
print("is_ignore == \n执行结果:", result, "\n")
if result == '':
return False
else:
return True
if __name__ == '__main__':
path = input("Images.xcassets的文件夹路径并点击Enter开始:\n") # /Users/admin/ios/fmapp/Images.xcassets
srcpath = input("输入xcodeproj文件所在文件夹路径并按Enter开始:\n")
# 新的路径
testTwo = '%s/%s' % (srcpath,os.path.basename(path)) # /Users/admin/iosdeleteYoushangcheng/Images.xcassets
if os.path.exists(testTwo) == False:
shutil.move(path, srcpath) # 将文件进行移动原因,如果不把文件移动出来,在查找的时候,会再次查找一遍Images.xcassets文件,导致很多没引用的图片也能搜到
images = glob.glob('%s/*/*.imageset' % testTwo)
print("images的长度:", len(images))
find_un_used()
5、代码执行效果
6、unused.txt中存放的未使用图片的路径