XZ_Python3之查找和清理Xcode中未使用的图片

目录

一、Xcode中图片的引用方式

二、搜索的原理

三、使用 ag 查找图片

四、代码实现

五、参考文章

项目在更新迭代的过程中,难免会有一些不再使用的图片,没有及时的删除。如果手动一个一个的搜,就太麻烦了。

本篇讲述使用脚本,查找每个图片名在Xcode中是否有引用,跟在Xcode中的全局查找差不多。

如果大家还不了解 ag,则可以通过这篇文章进行一个简单的了解:

XZ_Python3之查找和清理Xcode中未使用的文件

一、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()

4、GitHub源码地址

5、代码执行效果

6、unused.txt中存放的未使用图片的路径

五、参考文章

http://www.cocoachina.com/ios/20160531/16536.html

https://blog.csdn.net/soccer_zzm/article/details/52700502

猜你喜欢

转载自blog.csdn.net/understand_XZ/article/details/81951910