如何在XCode项目中find未使用的图像?

有没有人在XCode项目中find未使用的图像? (假设所有文件在代码或项目文件中都被名称引用 – 没有代码生成的文件名。)

这些文件往往是build立在一个项目的生命周期,并且很难判断是否可以删除任何给定的png。

对于不包含在项目中的文件,只是在文件夹中挂起,可以按

cmd⌘ + alt⌥ + A

而且不会变灰。

对于既没有在xib中也没有在代码中引用的文件,这样的东西可能会工作:

#!/bin/sh PROJ=`find . -name '*.xib' -o -name '*.[mh]'` find . -iname '*.png' | while read png do name=`basename $png` if ! grep -qhs "$name" "$PROJ"; then echo "$png is not referenced" fi done 

这是一个更强大的解决scheme – 它检查任何文本文件中对基本名称的引用。 注意上面的解决scheme不包括故事板文件(完全可以理解,当时不存在)。

Ack使得这个速度非常快,但是如果这个脚本频繁运行,会有一些明显的优化。 例如,如果您有两个视网膜/非视网膜资产,则此代码会检查每个基本名称两次。

 #!/bin/bash for i in `find . -name "*.png" -o -name "*.jpg"`; do file=`basename -s .jpg "$i" | xargs basename -s .png | xargs basename -s @2x` result=`ack -i "$file"` if [ -z "$result" ]; then echo "$i" fi done # Ex: to remove from git # for i in `./script/unused_images.sh`; do git rm "$i"; done 

我尝试了Roman的解决scheme,并join了一些调整来处理视网膜图像。 它运作良好,但是请记住,图像名称可以用代码以编程方式生成,并且此脚本会错误地将这些图像列为未引用。 例如,你可能有

NSString *imageName = [NSString stringWithFormat:@"image_%d.png", 1];

这个脚本会错误地认为image_1.png被引用。

这是修改的脚本:

 #!/bin/sh PROJ=`find . -name '*.xib' -o -name '*.[mh]' -o -name '*.storyboard' -o -name '*.mm'` for png in `find . -name '*.png'` do name=`basename -s .png $png` name=`basename -s @2x $name` if ! grep -qhs "$name" "$PROJ"; then echo "$png" fi done 

请尝试LSUnusedResources 。

它受到了jeffhodnett的“ 未使用”的严重影响,但老实说,Unused非常缓慢,结果并不完全正确。 所以我做了一些性能优化,search速度比Unused更快。

可能是你可以尝试修长 ,做一个体面的工作。

更新:有了emcmanus的想法,我继续创build一个没有ack的小实用程序,只是为了避免在机器上进行额外的设置。

https://github.com/arun80/xcodeutils

只有这个脚本正在为我工​​作,甚至处理文件名中的空间:

编辑

更新为支持swift文件和cocoapod 。 默认情况下,它不包括Pods目录,只检查项目文件。 要运行以检查Pods文件夹,请使用--pod attrbiute运行:

/.finunusedimages.sh --pod

这是实际的脚本:

 #!/bin/sh #varables baseCmd="find ." attrs="-name '*.xib' -o -name '*.[mh]' -o -name '*.storyboard' -o -name '*.mm' -o -name '*.swift'" excudePodFiles="-not \( -path */Pods/* -prune \)" imgPathes="find . -iname '*.png' -print0" #finalize commands if [ "$1" != "--pod" ]; then echo "Pod files excluded" attrs="$excudePodFiles $attrs" imgPathes="find . $excudePodFiles -iname '*.png' -print0" fi #select project files to check projFiles=`eval "$baseCmd $attrs"` echo "Looking for in files: $projFiles" #check images eval "$imgPathes" | while read -d $'\0' png do name=`basename -s .png "$png"` name=`basename -s @2x $name` name=`basename -s @3x $name` if grep -qhs "$name" $projFiles; then echo "(used - $png)" else echo "!!!UNUSED - $png" fi done 

您可以制作一个grep源代码的shell脚本,并将创build的图像与您的项目文件夹进行比较。

这里是GREPLS

很容易,你可以循环所有的源文件,保存图像在数组或类似的东西,并使用

cat file.m | grep [-V] myImage.png

有了这个技巧,你可以search项目源代码中的所有图像!

希望这可以帮助!

我写了一个lua脚本,我不确定我可以分享它,因为我在工作中做了,但是效果很好。 基本上这是这样的:

第一步 – 静态图像引用 (简单的位,其他答案覆盖)

  • recursion地查看图像目录,并提取图像名称
  • 剥离.png和@ 2x的图像名称(不需要/在imageNamed中使用:)
  • 以文本方式在源文件中search每个图像名称(必须在string文字内)

第二步 – dynamic图像参考 (趣味位)

  • 在包含格式说明符的源代码中提取所有string文本列表(例如%@)
  • 用正则expression式replace这些string中的格式说明符(例如,“foo%dbar”变成“foo [0-9] * bar”
  • 使用这些正则expression式string,通过图像名称进行文本search

然后删除在search中找不到的内容。

边缘情况是来自服务器的图像名称不被处理。 为了处理这个,我们在这个search中包含服务器代码。

我对@EdMcManus提供的用于处理使用资产目录的项目的出色答案做了一个很小的修改。

 #!/bin/bash for i in `find . -name "*.imageset"`; do file=`basename -s .imageset "$i"` result=`ack -i "$file" --ignore-dir="*.xcassets"` if [ -z "$result" ]; then echo "$i" fi done 

我真的不写bash脚本,所以如果在这里有可能改进(可能)让我知道在评论中,我会更新它。

使用其他的答案,这是一个很好的例子,如何忽略两个目录上的图像,不要searchpbxproj或xcassets文件(小心应用程序图标和启animation面)的图像的出现。 更改–ignore-dir = *。xcassets中的*以匹配您的目录:

 #!/bin/bash for i in `find . -not \( -path ./Frameworks -prune \) -not \( -path ./Carthage -prune \) -not \( -path ./Pods -prune \) -name "*.png" -o -name "*.jpg"`; do file=`basename -s .jpg "$i" | xargs basename -s .png | xargs basename -s @2x | xargs basename -s @3x` result=`ack -i --ignore-file=ext:pbxproj --ignore-dir=*.xcassets "$file"` if [ -z "$result" ]; then echo "$i" fi done 

我用这个框架:

http://jeffhodnett.github.io/Unused/

该死的工作! 我看到的问题只有两个地方是当图像名称来自服务器,当图像资源名称不同于资产文件夹内图像的名称…

您可以尝试Xcode的FauxPas应用程序 。 这是非常好的发现丢失的图像和许多其他问题/侵犯有关的Xcode项目。