当前位置: 首页 > 科技观察

如何在运行时更改应用程序图标

时间:2023-03-21 22:41:46 科技观察

当你完成你的应用程序的测试版后,最终会有人为你测试它,这样你就可以完善应用程序......或者会有投资优惠。但是,如果测试人员有一种简单的方法来检查应用程序的构建,这不是很有帮助吗?本教程将向您展示这一点,并向您介绍Xcode中一些可能鲜为人知的功能。你相信你不会在本教程中编写一行Swift代码吗?当然,您也不必编写一行Objective-C代码。本教程将让您编写一些bashshell脚本。您将使用ImageMagick、Terminal和Xcode编写一个脚本,自动将“调试”或“测试版”徽标添加到您应用程序的图标。本教程要求您具备一些Unix脚本的基本知识。您可以向一些shell脚本专家学习,也可以从Bash初学者指南或Bas脚本高级编程指南中学习。你想接下来做这些吗?应用程序图标准备首先,你需要安装ImageMagick,这是一个非常强大的图形处理软件套件,专门通过终端安装。你可以很容易地通过Homebrew安装ImageMagick。如果你没有安装Homebrew,或者你不知道它是什么,你可以在主页上了解并安装它。如果你已经安装了Homebrew,打开终端输入:brewupdate这是确认你是否安装了Homebrew的最新安装包,这也是确认你是否安装了Homebrew。所以,现在,使用Homebrew安装你需要的包。现在输入以下命令:brewinstallImageMagick你会看到一个通过Homebrew的东西列表,显示了ImageMagick安装的详细过程,所以按照步骤安装。接下来,您还需要安装Ghostscript,因为您将要使用的ImageMagick依赖于它。Ghostscript是一个用于渲染PDF和PS文件的软件套件。您需要它,因为它提供了支持ImageMagick的字体。通过运行以下命令安装Ghostscript:brewinstallghostscript如果发生错误,请运行此命令:brewdoctor如果安装失败,您将收到一条消息并告诉您如何修复它。这些都是您需要安装才能在本教程中使用的。HiLlamaImageMagick中有很多命令,但是对于本教程,您需要使用的是convert和composite(转换和组合)convert:一张图片,对其进行修改,并将其另存为新图片;composite:一张图片,在上面叠加另一张图片,另存为新的第三张图片。本教程提供了一些简单的图标供使用。当然你也可以使用自己的图标,但是需要修改为对应的文件名。在此处下载图标,对于本教程,将其放在您的桌面上。这里的目标之一是覆盖构建版本应用程序的图标。因此,您将看到如何使用ImageMagick覆盖文本图像,将HelloWorld放在其中一个图标上。打开终端并转到放置应用程序图标的文件夹:cd~/Desktop/AppIconSet现在输入:convertAppIcon60x60@2x.png-fillwhite-fontTimes-Bold-pointsize18-gravitysouth-annotate0"HelloWorld"test.png我会打破它一一记下这一行命令,这样你就会明白它的作用:AppIcon60x60@2x.png是输入图像的名称;fillwhite将文本设置为白色;fontTimes-Bold告诉ImageMagick使用什么字体;pointsize18设置字体大小为18;gravitysouth将文本与图像底部对齐annotate0"HelloWorld"告诉ImageMagick将带有"HelloWorld"文本注释的图像旋转到0度;test.png是输出文件名,ImageMagick将覆盖它已经存在的文件。如果你在终端上没有看到任何错误,那么你会在AppIconSet文件夹中看到一个名为test.png的文件,打开后你会看到这个:提示:如果你看到错误信息,或者脚本没有工作,那么您可能没有安装所需的字体。通过运行以下命令查看可用的字体。convert-listfont如果您没有Times字体,请选择一种您可以使用的字体。现在,将beta徽标加载到图像上。在终端输入:compositebetaRibbon.pngtest.pngtest2.png这是把betaRibbon.png放在test.png上面,然后将合成图保存为test2.png,打开test2.png。等等,您仍然看到原始的test.png。那是为什么呢?test.png的大小是120x120,而betaRibbon.png是1024x1014,所以只有betaRibbon.png的透明部分在test.png上,其余部分被裁剪了。不相信我?然后尝试相同的命令,但交换betaRibbon.png和test.png。compositetest.pngbetaRibbon.pngtest2.png您现在将在test.png的右上角看到一张带有beta的大图像:要获得我们想要的效果,您需要将betaRibbon.png的大小更改为120x120。这在ImageMagick中非常容易。直接输入:convertbetaRibbon.png-resize120x120smallBetaRibbon.png这个命令就是把betaRibbon.png的尺寸改成120x120,保存为smallRetaRibbon.png现在,执行下面的命令:compositesmallBetaRibbon.pngtest.pngtest2.png打开test2.png,然后那么您将看到我们期待的内容:这些是您在本教程中需要了解的ImageMagick的功能,但这些只是ImageMagick可以做的事情的冰山一角。查看ImageMagick的主页以了解有关其功能的更多信息。#p#Xcode在完成所有这些图像处理工作之后,是时候回到我们熟悉的平台了。打开Xcode,选择File\New\Project...选择iOS\Application\SingleViewApplication,点击Next。将项目命名为LlamaTrot,选择语言为Swift,并将设备设置为Universal。然后将项目保存在桌面上。您的目标是根据所选的构建配置,通过Xcode和ImageMagick在每次构建时生成一个合适的图标。Xcode可以在构建项目时运行脚本来执行操作。运行脚本只是Unix脚本,就像您已经编写的那样,它会在您每次运行Xcode项目时执行。在你的项目中设置一个运行脚本,选择LlamaTrot的Target,然后选择BuildPhases,点击+,在弹出的菜单中选择NewRunScriptPhase:你会看到RunScriptPhase被添加到你的项目配置中.运行脚本时,Shell参数自动设置为bin/sh,即脚本将在bashUnixshell中执行。下面的框供您编写脚本。在框中键入:echo"HelloWorld"您的新构建阶段应该如下所示:构建并运行。你会看到什么也没有发生。发生这种情况是因为脚本在您的构建日志中打印了“HelloWorld”。单击Xcode导航栏面板最右侧的ReportNavigator图标,然后单击最近构建的报告,如下图所示。当你构建一个项目时,这是Xcode为你做的一切,你会看到“HelloWorld”:应用程序图标很好,现在你已经编写了一个输出“HelloWorld”的脚本,就像你完成打印一样在我作为开发人员的职业生涯中,“HelloWorld”一百万次。现在是时候修改应用程序的图标了。从脚本中找到应用程序图标将所有应用程序图标添加到Images.xcassets,将每个图标拖动到适当的AppIcon大小:此外,您还将debugRibbon.png和betaRibbon.png放在和中。在xcodeproj同级目录文件中。为了使用图标,您的脚本需要知道确认图标的位置。用以下代码替换您之前编写的脚本:echo"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"echo"${SRCROOT}"第一行打印您运行项目后的文件夹路径,包括最后一个图标。第二行打印项目文件所在的文件夹路径。这是使用Xcode的一些构建设置的变量。运行您的项目并查看构建报告。您将看到描述项目最终产品的文件的路径。在它下面,您将看到项目工作的文件路径:导航到第一个文件夹并查看它的位置;您会看到应用中的所有内容,包括所有应用图标。这是ImageMagick修改后的图标存放的地方。您可以通过右键单击“应用程序”图标并选择“显示包内容”来查看这些图标。现在它们看起来都非常正常!现在导航到打印的第二个文件路径。这只是您的普通工程项目的文件夹。那么应用程序图标在哪里?转到具有相同名称的LlamaTrot文件。在里面你会看到Images.xcassets。打开Images.xcassets,您将看到另一个名为AppIcon.appiconset的文件。应用程序图标位于此文件夹中,您将通过ImageMagick修改它们。假设你把你的项目保存在桌面上,并命名为LlamaTrot,那么图标的路径为~/Desktop/Llama\Trot/Llama\Trot/Images.xcassets/AppIcon.appiconset将脚本的最后一行替换为如下代码,您将获得原始图标的完整路径:IFS=$'\n'echo$(find${SRCROOT}-name"AppIcon60x60@2x.png")第一行设置IFS内部字段分隔符换行符。如果不这样做,第二行将失败,因为文件名LlamaTrot包含空格。如果您对没有第一行的情况感到好奇,可以尝试将其删除。在第二行中,此命令递归地在${SRCROOT}文件夹中搜索文件AppIcon60x60@2x.png。运行该项目,您将看到打印出AppIcon60x60@2x的完整路径:将它们放在一起的艰苦工作已经结束。现在是时候将它们放在一起并通过脚本修改应用程序的图标了。您将首先修改AppIcon60x60@2x.png,然后处理所有应用程序图标。这意味着您需要在Retina@2x模拟器或6Plus上进行测试。通过将ImageMagick的技术与您之前的脚本相结合,您最终会得到以下脚本。确保更新适当的脚本:IFS=$'\n'#1PATH=${PATH}:/usr/local/bin#2TARGET_PATH="${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AppIcon60x60@2x.png"BASE_IMAGE_PATH=$(查找${SRCROOT}-名称“AppIcon60x60@2x.png”)#3convertbetaRibbon.png-resize120x120resizedBetaRibbon.png#4convert${BASE_IMAGE_PATH}-fillwhite-fontTimes-Bold-pointsize18-gravitysouth-annotate0“HelloWorld”-|compositeresizedBetaRibbon-${TARGET_PATH}现在来分析发生了什么:如果省略第一行,编译就会失败。您的终端有一个名为PATH的变量来存储一些默认的本地脚本。对于所有命令,终端首先考虑这一点,默认情况下不是Unix的一部分。这允许在不指定完整命令位置的情况下运行位于目录路径中的任何命令。Xcode需要与您的终端共享相同的PATH变量。此行将/user/local/bin添加到安装Homebrew的PATH变量。接下来两行获取本地应用图标,然后分别将路径保存到TARGET_PATH和BASE_IMAGE_PATH变量中。这一行是将betaRibbon.png图标的大小调整为合适的大小;最后一行做了两件事。首先,它将“HelloWorld”文本添加到原始应用程序图标。该脚本然后执行合成功能-将带有beta徽标的图像放在其顶部。然后将合成的图片保存为应用程序的图标。提示:应用程序图标名称不是随意的。在最终产品中,应用程序图标名称必须类似于AppIcon60x60@2x.png。Xcode使用此命名约定来根据设备确定要使用的图标。运行该项目并在设备的主屏幕上看到您的应用程序图标;如果您正在模拟它,请按Cmd+Shift+H切换到主屏幕。你会看到一个修改过的图标:#p#Remainingicons现在你已经处理了一个图标,是时候让这个脚本处理所有图标以在iPad、iPhone6+等上显示了。为此,你将修改代码进入一个以图标名称作为参数的函数。然后为每个图标执行函数。像这样修改脚本:PATH=${PATH}:/usr/local/binIFS=$'\n'functiongenerateIcon(){BASE_IMAGE_NAME=$1TARGET_PATH="${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${BASE_IMAGE_NAME}"BASE_IMAGE_PATH=$(查找${SRCROOT}-name${BASE_IMAGE_NAME})WIDTH=$(identify-format%w${BASE_IMAGE_PATH})convertbetaRibbon.png-resize$WIDTHx$WIDTHresizedRibbon.pngconvert${BASE_IMAGE_PATH}-fillwhite-fontTimes-Bold-pointsize18-gravitysouth-annotate0"HelloWorld"-|compositeresizedRibbon.png-${TARGET_PATH}}generateIcon"AppIcon60x60@2x.png"generateIcon"AppIcon60x60@3x.png"generateIcon"AppIcon76x76~ipad.png"generateIcon"AppIcon76x76@2x~ipad.png"这使得整个图像处理代码成为一个名为generateIcon()的函数,您将图标的名称作为参数传递给该过程。该脚本使用$1访问此参数,并设置变量BASE_IMAGE_PATH。${BASE_IMAGE_PATH}然后将AppIcon60x60@2x放置在之前放置的位置。您会发现ImageMagick的一个新功能,Identity,它获取有关图像的信息。在这种情况下,您希望使用通过识别中的-format%w获得的宽度来调整betaRibbon.png的大小。现在,选择iPad或iPhone6+模拟器,然后运行项目。这是因为字体大小以像素表示,不同的设备屏幕具有不同的像素密度。这很容易。您真正想要的是按相对于整个图标的一定比例设置文本的高度。立即在之前设置WIDTH变量的位置添加以下脚本:FONT_SIZE=$(echo"$WIDTH*.15"|bc-l)这行非常微妙,但它确实设置了FONT_SIZE变量宽度的五分之一。因为Unix算法不支持浮点运算,所以必须使用bc程序。basiccalculator的缩写,bc可以处理浮点型的计算。现在,使用FONT_SIZE变量而不是18更改最后一行generateIcon()。最终脚本应如下所示:PATH=${PATH}:/usr/local/binIFS=$'\n'functiongenerateIcon(){BASE_IMAGE_NAME=$1TARGET_PATH="${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${BASE_IMAGE_NAME}"BASE_IMAGE_PATH=$(find${SRCROOT}-name${BASE_IMAGE_NAME})WIDTH=$(identify-format%w${BASE_IMAGE_PATH}EFONT_SIZ$(echo"$WIDTH*.15"|bc-l)convertbetaRibbon.png-resize$WIDTHx$WIDTHresizedRibbon.pngconvert${BASE_IMAGE_PATH}-fillwhite-fontTimes-Bold-pointsize${FONT_SIZE}-gravitysouth-annotate0"HelloWorld"-|compositeresizedRibbon.png-${TARGET_PATH}}generateIcon"AppIcon60x60@2x.png"generateIcon"AppIcon60x60@3x.png"generateIcon"AppIcon76x76~ipad.png"generateIcon"AppIcon76x76@2x~ipad.png"运行你的项目不同的设备,你会发现好多了BuildNumber其实很容易将图标上的“HelloWorld”文本转换为内部版本号。版本的内部版本号可以找到在Info.plist中的CFBundleVersion中。那么如何将其放入脚本中呢?事实证明,您的Mac有一个程序可以为您做这件事。它叫做PlistBuddy,您可以在/usr/libexec/中找到它。在脚本顶部添加以下行:buildNumber=$(/usr/libexec/PlistBuddy-c"PrintCFBundleVersion""${PROJECT_DIR}/${INFOPLIST_FILE}")此行使用PlistBuddy获取内部版本号。现在只需将“HelloWorld”替换为$buildNumber:转换${BASE_IMAGE_PATH}-fillwhite-fontTimes-Bold-pointsize${FONT_SIZE}-gravitysouth-annotate0"$buildNumber"-|compositeresizedRibbon.png-${TARGET_PATH}inChangethebuild一般到2015年的数字:现在运行。您会看到带有构建编号的图标:构建配置很酷!整个过程即将完成。每次运行项目时,您都已将测试版徽标和内部版本号添加到应用程序图标。但是您不想永远成为测试版ID和内部版本号。那我现在该怎么办?在Xcode中,进入项目配置。您将看到两个默认设置:Debug和Release。点击+,选择DuplicateRelease并将其命名为Beta。Dubug配置将是调试版本,Beta配置将是测试版本,Release配置将是发布版本。现在你需要把这些配置放在你的脚本中,并通过CONFIGURATION来设置它们。始终在脚本中添加一个if以选择当前配置。更新你的脚本如下:IFS=$'\n'buildNumber=$(/usr/libexec/PlistBuddy-c"PrintCFBundleVersion""${PROJECT_DIR}/${INFOPLIST_FILE}")versionNumber=$(/usr/libexec/PlistBuddy-c"PrintCFBundleShortVersionString""${PROJECT_DIR}/${INFOPLIST_FILE}")PATH=${PATH}:/usr/local/binfunctiongenerateIcon(){BASE_IMAGE_NAME=$1TARGET_PATH="${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${BASE_IMAGE_NAME}"echo$TARGET_PATHecho$SRCROOTecho$(find${SRCROOT}-name"AppIcon60x60@2x.png")BASE_IMAGE_PATH=$(find${SRCROOT}-name${BASE_IMAGE_NAME})WIDTH=$(identify-format%)w${BASE_IMAGE_PATH})FONT_SIZE=$(echo"$WIDTH*.15"|bc-l)echo"fontsize$FONT_SIZE"if["${CONFIGURATION}"=="Debug"];thenconvertdebugRibbon.png-resize${WIDTH}x${WIDTH}resizedRibbon.pngconvert${BASE_IMAGE_PATH}-fillwhite-fontTimes-Bold-pointsize${FONT_SIZE}-gravitysouth-annotate0"$buildNumber"-|compositeresizedRibbon.png-${TARGET_PATH}fiif["${CONFIGURATION}"=="Beta"];thenconvertbetaRibbon.png-resize${WIDTH}x${WIDTH}resizedRibbon.pngconvert${BASE_IMAGE_PATH}-fillwhite-fontTimes-Boldr-点数${FONT_SIZE}-gravitysouth-annotate0"$buildNumber"-|compositeresizedRibbon.png-${TARGET_PATH}fi}generateIcon"AppIcon60x60@2x.png"generateIcon"AppIcon60x60@3x.png"generateIcon"AppIcon76x76~ipad.png"generateIcon"AppIcon76x76@2x~ipad.png"通过选择Product\Scheme\EditScheme...更改构建配置,选择Info,然后根据您要执行的操作选择构建配置,Run、Archive、Profile等。这就是它!有内部版本号和标志应用程序图标!betadebug另外代码可以点击下载参考