应用程序的构建时属性使用可选的 `build.settings` 文件定义,该文件使用 Lua 语法编写,应放置在项目的根目录中。
本指南概述了 Solar2D 支持的各种平台上应用程序最常见的构建设置。对于需要更高级设置的开发者,请参阅高级构建设置指南,了解可用的选项。
至少,`build.settings` 文件应包含一个 `settings` 表,该表将包含各种子表来指示
settings = { -- Child tables here }
`build.settings` 文件可用于设置应用程序方向与设备在空间中的物理方向的关系 — 这包括
所有方向设置都必须包含在 `settings` 中的 `orientation` 表中。
settings = { orientation = { -- Parameters }, }
在 `orientation` 表中,有两个可选键值:`default` 和 `supported`。
settings = { orientation = { default = "", -- Initial launch orientation supported = {}, -- Table of allowed options for auto-orientation }, }
它们分别接受以下**方向约定**:
名称 | 方向 |
---|---|
`"portrait"` |
设备处于垂直位置,Home 键位于底部 |
`"portraitUpsideDown"` |
设备处于垂直位置,Home 键位于顶部 |
`"landscapeLeft"` |
设备处于水平位置,Home 键位于左侧 |
`"landscapeRight"` |
设备处于水平位置,Home 键位于右侧 |
在大多数设备上,如果设备在运行时旋转或翻转,**自动方向**将由加速度计触发。如果要将应用程序限制为横向,请在 `supported` 表中同时指定 `"landscapeLeft"` 和 `"landscapeRight"`。
supported = { "landscapeLeft", "landscapeRight" },
同样,要将应用程序限制为纵向,请同时指定 `"portrait"` 和 `"portraitUpsideDown"`。
supported = { "portrait", "portraitUpsideDown" },
当设备方向改变时,显示舞台上的**坐标位置** `(0,0)` 将对应于当前方向的左上角。
**iPad** 忽略 `default` 设置,并尝试以设备当前的物理方向启动,假设该方向在支持列表中指定。
如果需要检测当前设备方向,可以从system.orientation 属性读取。这将提供上述四个标准约定中的一个值。此外,iOS 设备可能会报告 `"faceUp"` 或 `"faceDown"` 方向。
在 `settings` 表中,可以包含嵌套在 `iphone` 表中的 `plist` 表。此 `plist` 表用于设置已编译应用程序的 `Info.plist` 文件的值。
settings = { iphone = { plist = { CFBundleIconFiles = {}, -- Required! UILaunchStoryboardName = "LaunchScreen", -- Required! UIStatusBarHidden = true, CFBundleDisplayName = "Solar2D App", CFBundleName = "Solar2D App", }, }, }
`iphone` 表包含**所有** iOS 设备,而不仅仅是 iPhone 设备。
对于 `plist` 键中的布尔值,请使用
在上面的示例中,显示了一些常见的 `plist` 键:
`CFBundleIconFiles`(表)— 与应用程序关联的应用程序图标图像文件的**必需**表。有关详细信息,请参阅下面的自定义应用程序图标。
`UILaunchStoryboardName` — 指向有效 `.storyboardc` 文件的**必需**字符串。有关重要详细信息,请参阅下面的启动屏幕 — iOS。
`UIStatusBarHidden`(布尔值)— 指定应用程序启动时状态栏是否应初始隐藏。
`CFBundleDisplayName`(字符串)— 包的显示名称。如果**不需要**本地化应用程序,并且包名称仅包含 ASCII 字符,则省略此键,并在模拟器**构建 iOS** 窗口中将包名称指定为**应用程序名称**。如果本地化应用程序(指南),请在 `plist` 表和语言的 `InfoPlist.strings` 文件中包含此键
`CFBundleName`(字符串)— 16 个字符或更短的应用程序短名称。如果包名称仅包含 ASCII 字符,则省略此键,并在模拟器**构建 iOS** 窗口中将包名称指定为**应用程序名称**。如果本地化应用程序(指南),则应在 `plist` 表中包含此键,并在语言的 `InfoPlist.strings` 文件中与 `CFBundleDisplayName` 一起包含此键
有关支持的值以及如何使用它们的更多信息,请参阅 Apple 的文档。
在 iOS 上,访问某些硬件或
settings = { iphone = { plist = { NSCameraUsageDescription = "This app would like to access the camera.", NSPhotoLibraryUsageDescription = "This app would like to access the photo library.", NSPhotoLibraryAddUsageDescription = "This app would like to add the photo library.", }, }, }
当系统提示用户允许访问时,关联的描述将作为警报的一部分显示。请注意,可以根据您的喜好自定义描述,甚至可以对其进行本地化(指南)。
以下 API 受 iOS 权限的影响,因此如果使用以下任何命令,则应在关联的 API 文档中包含注明的权限键:
除了上面提到的 iOS 设置之外,高级构建设置指南中还概述了以下构建选项:
在 `settings` 表中,可以包含 `android` 表来控制 Android 设备的构建设置。
settings = { android = { }, }
可以使用 `build.settings` 文件中的可选 `versionCode`
settings { android = { versionCode = "11", }, }
版本号必须指定为**整数** — 它不能包含任何小数点。一种可能的方案是将版本 **1.0** 的 `versionCode` 设置为 `"10"`。下一个更新将是版本 **1.1** 的 `"11"`,依此类推。
`usesPermissions` 表在 `AndroidManifest.xml` 文件中创建`<uses-permission>`
settings { android = { usesPermissions = { "android.permission.INTERNET", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION", }, }, }
在上面的示例中,展示了一些有用的 `android.permission` 键:
有关支持的值以及如何使用它们的更多信息,请参阅 Android文档。
`usesFeatures` 表在 `AndroidManifest.xml` 文件中创建`<uses-feature>`
settings { android = { usesFeatures = { { name="android.hardware.camera", required=true }, { name="android.hardware.location", required=false }, { name="android.hardware.location.gps", required=false }, }, }, }
如果**需要**某个功能(`required=true`),则缺少该功能的设备将无法下载或购买该应用程序。作为预防措施,如果您的应用程序将该功能用于某些方面,但不需要它用于“基本功能”,则应在 `usesFeatures` 表中包含该功能,但将其 `required` 键设置为 `false`。
{ name="android.hardware.camera", required=false },
`usesExpansionFile` 布尔值指示是否应使用扩展文件构建应用程序。如果设置为 `true` 并且构建目标是 Google Play,则项目目录中除 Lua 脚本之外的所有内容都将放入扩展文件中。有关详细信息,请参阅 Android文档。
settings = { android = { -- This tells the Simulator to create an expansion file usesExpansionFile = true, -- The following permissions are required to download expansion files usesPermissions = { "android.permission.INTERNET", "com.android.vending.CHECK_LICENSE", "android.permission.WRITE_EXTERNAL_STORAGE", }, }, }
使用扩展文件需要设置 Google 许可。有关详细信息,请参阅此处。
除了上面提到的 Android 设置之外,高级构建设置指南中还概述了以下构建选项:
设置/功能 | 用途 |
---|---|
最低 SDK 版本 | 允许您将应用程序排除在安装在具有较旧 Android 版本的设备上。 |
Android TV | 如果要将应用程序部署到 Android TV,则为必需。 |
屏幕支持 | 指定/限制 Android 应用程序支持的屏幕。 |
禁用文件访问 | 用于阻止对应用程序文件的所有访问。 |
大堆 | 请求 Android 操作系统为您的应用程序提供更多堆内存。 |
Android 指令 | 用于 |
对于 macOS 桌面或 Win32 桌面应用程序,`build.settings` 文件支持 `window` 表来自定义应用程序的桌面窗口。
settings = { window = { }, }
请参阅 创建 macOS 桌面应用程序 或 创建 Win32 桌面应用程序 中的示例,了解详细信息以及可接受的 window
参数的完整列表。
Solar2D 提供了几个可在您的项目中使用的 插件。 这些插件可以通过嵌套在 settings
表中的 plugins
表来包含。
settings = { plugins = { }, }
例如,Google Play 游戏服务 插件可以按如下方式包含:
settings = { plugins = { ["plugin.gpgs"] = { publisherId = "com.coronalabs" }, }, }
插件键名通常包含标点符号,例如 plugin.gpgs
。 在这些情况下,您必须使用“括号和引号”方法来定义键 (["plugin.gpgs"]
)。
在部署应用程序之前,您应该为目标平台设计合适的**应用程序图标**。
对于 iOS,需要几个图标文件。 请参阅 管理 Xcode 资源 指南,了解有关 Images.xcassets
文件夹以及如何在您的应用程序中包含/引用它的参考。
Google 已经改变了 Android 8 及更高版本中使用自适应图标管理 Android 图标的方式。 从每日构建版本 2019.3504 及更高版本开始,现在使用 AndroidResources
文件夹处理图标。 请参阅我们的 自适应图标 指南了解更多信息。
对于 Android,图标文件将在构建期间复制到 .apk
中,假设它们在您的根项目文件夹中可用main.lua
一起)
文件 | 大小 (宽×高) |
---|---|
Icon-xxxhdpi.png |
192 × 192 |
Icon-xxhdpi.png |
144 × 144 |
Icon-xhdpi.png |
96 × 96 |
Icon-hdpi.png |
72 × 72 |
Icon-mdpi.png |
48 × 48 |
Icon-ldpi.png |
36 × 36 |
桌面应用程序 — 为 macOS 或 Windows 构建的应用程序 — 需要以下附加图标
对于 macOS 桌面应用程序,您必须添加一个Icon-osx.icns
.icns
文件中(详情)。 请参阅 创建 macOS 桌面应用程序 指南了解更多信息。
对于 Windows 桌面应用程序,您必须添加一个Icon-win32.ico
.ico
文件中(详情)。 请参阅 创建 Win32 桌面应用程序 指南了解更多信息。
为电视系统设计的应用程序需要额外的图标
对于 Apple 的 tvOS,需要几个独特的图标和资源。 请参阅 管理 Xcode 资源 指南,了解有关 Images.xcassets
文件夹以及如何在您的应用程序中包含/引用它的参考。
对于 Android TV,您应该在项目文件夹中包含一个Banner-xhdpi.png
默认情况下,应用程序打开时将出现 Solar2D 品牌的启动画面。 可以自定义或禁用此启动画面。
如果您想显示自己的自定义启动画面,请在上面的 build.settings
中包含 splashScreen
表,但将 enable
键设置为 true
并添加一个定义图像名称的 image
键。 例如:
settings = { splashScreen = { enable = true, image = "mySplashScreen.png" }, }
或者,您可以自定义启动画面
settings = { splashScreen = { ios = { enable = true, image = "mySplashScreen_iOS.png" }, android = { enable = true, image = "mySplashScreen_Android.png" } }, }
对于自定义实现,image
指示项目中任何图像文件的路径。 图像将显示在黑色背景上,它将与应用程序的默认方向匹配,并缩放以适合当前设备的屏幕。 您可能需要进行试验才能获得理想的启动画面图像,但如果它足够大以适用于您的应用程序将在其上运行的最大设备,则您只需要一个图像。
由于 build.settings
不适用于通过 Solar2D Native 执行的应用程序构建,因此需要特殊处理才能在这些实例中自定义启动画面
对于 iOS,请在应用程序包的根目录中放置一个名为 _CoronaSplashScreen.png
的图像,并在 Xcode 中将其指定为“资源”。
对于 Android,请使用 Android Studio 或其他合适的机制将名为 _corona_splash_screen.png
的图像放置在 res/drawable/
中。
要删除默认启动画面,请将 splashScreen
表添加到项目的 build.settings
中,并将 enable
键设置为 false
settings = { splashScreen = { enable = false }, }
或者,您可以删除启动画面
settings = { splashScreen = { ios = { enable = false }, android = { enable = true } }, }
对于 iOS,您必须包含某种形式的**启动画面**支持。 Apple 建议您为此使用
为方便起见,默认的(空白)LaunchScreen.storyboardc
文档会自动添加到所有新项目模板中。 同一文件也与应用程序本身捆绑在一起,以防您需要将其复制到现有项目中。 它可以在 Solar2D 应用程序文件夹中的以下位置找到
/Applications/Corona/Resources/Resource Library/iOS/LaunchScreen.storyboardc
可以使用您自己的图像/布局自定义 Xcode 故事板文档 — 请参阅我们的 指南 获取说明。
如果您在现有项目中使用默认的 LaunchScreen.storyboardc
文件,则**必须**在 plist
表中包含 UILaunchStoryboardName
键,以便 iOS 识别该文件的存在。 请注意,键的值 ("LaunchScreen"
) 与文件名本身匹配,但不包括文件扩展名
settings = { iphone = { plist = { UILaunchStoryboardName = "LaunchScreen", -- Required! }, }, }
排除文件是 Solar2D 的一项功能 — 它不适用于 Solar2D Native 构建。
更复杂的应用程序可能具有一些在一个平台上需要但在另一个平台上不需要的文件。 例如,每个平台的图标文件都不同,您可能只想在每个平台上包含适当的文件。 这不是 Solar2D 自动处理的事情,因为文件命名可能会有所不同,并且无法预测独特的情况。 大多数开发人员不需要指定应从构建中排除的文件,但如果需要,可以使用该选项。
要排除的文件是指定的ios
、android
、macos
、win32
、tvos
,all
—*
表示任何字符串,有时包括 /
。 换句话说,这些模式将应用程序包中文件的路径名作为字符串进行匹配。 这通常仅在您具有复杂目录结构,并且在不同级别上具有多个同名目录实例时才重要,例如 a/music
、a/b/music
、a/b/c/music
等。请注意,即使在 Windows 上构建,目录分隔符也始终是正斜杠 /
。
文件排除是一项强大的功能,如果您不明智地使用此过程并意外排除了对其操作至关重要的文件,则可能会损坏您的应用程序包。 对 excludeFiles
设置进行任何更改后,请在下次构建期间仔细监控控制台并注意任何问题。 您还应该仔细检查应用程序包的内容,并检查究竟包含哪些文件。
考虑以下有关如何排除各种文件名和类型的示例
settings = { excludeFiles = { -- Exclude unnecessary icon assets from all builds all = { "Icon*.png", "Images.xcassets", "Icon*.ico", "Icon*.icns" }, }, }
settings = { excludeFiles = { -- Exclude iOS launch screen bundle on Android devices android = { "LaunchScreen.storyboardc" }, }, }
settings = { excludeFiles = { -- Exclude all files at all paths which end with "secret.txt" all = { "*secret.txt" }, }, }
settings = { excludeFiles = { -- Exclude all .aac files in the "music" directory on Android devices android = { "music/*.aac" }, -- Exclude all .ogg files in the "music" directory on iOS devices ios = { "music/*.ogg" }, }, }
settings = { excludeFiles = { -- Exclude unnecessary assets from macOS desktop apps macos = { "Icon*.ico" }, -- Exclude unnecessary assets from Win32 desktop apps win32 = { "Icon*.icns" }, }, }