彭某的技术折腾笔记

彭某的技术折腾笔记

macOS 中如何从脚本或可执行文件创建 App

46
2023-06-28

macOS 中如何从脚本或可执行文件创建 App

2023年6月28日

摘要

众所周知,Launchpad 是 Mac 中集中存放各种应用程序的地方,由于 macOS 使用了 xxx.app(本质是一个文件夹) 这样的方式来组织每一个 App,因此常规的脚本和可执行文件并不能直接放入 /Applications/ 目录被 Launchpad 识别。本文提供了一个方法,按照 macOS 的标准将脚本或可执行文件转化为一个简单的 App。

macOS App Bundle 结构

每一个 xxx.app 包都至少具有以下基本结构:

Test.app
└── Contents
    ├── Info.plist
    └── MacOS
        └── Test

以 Test.app 为例,其本身是一个文件夹,内部包含一个名为 Contents 的文件夹,这其中又包含一个名为 MacOS 的文件夹(用于存放实际的程序文件),和一个名为 Info.plist 的 XML 文档(用于储存应用的各种描述信息如名称及版本号)。在 MacOS 目录下,包含实际的脚本或可执行文件,且该文件必须与去除 .app 的包名完全一致,并具有可执行权限。

实现步骤

本文以一个极其简单的脚本为例:

#!/bin/sh
mkdir -p ~/Downloads/test_dir

该脚本将在用户的 Downloads 目录下新建一个名为 test_dir 的文件夹。

首先,在终端中创建 App 所需的三级目录结构:

mkdir -p Test.app/Contents/MacOS

其中,-p 选项代表递归创建每一级目录,如没有此选项,则一次只能创建一级目录。当然,如不想使用命令行,也可以在 Finder 中直接创建。

然后在 Test.app/Contents/MacOS 下创建名为 Test 的文件,没有后缀名!!!

nano Test

再将前文所述脚本内容粘贴进去,保存,并使用 chmod 命令赋予其可执行权限:

chmod a+x Test

最后,在 Contents 目录中新建 Info.plist 文件,将以下内容粘贴进去:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string>Test</string>
    <key>CFBundleGetInfoString</key>
    <string>LONG VERSION DESCRIPTION TEXT</string>
    <key>CFBundleIdentifier</key>
    <string>com.apple.example</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>LSMinimumSystemVersion</key>
    <string>10.6</string>
  </dict>
</plist>

此描述文件中的各种 string 可以根据其上方的 key 进行更改。CFBundleExecutable 的值必须与可执行文件名称完全一致

完成此步骤后,此 App 便可以直接运行了。

添加图标

右键创建好的应用程序包,选择显示简介,将任意一张想要作为图标的图像拖进所示位置即可完成图标的添加:

Place to Put Icon

最终结果如图:

Final State

  • 0