From d3e16c9ee2421aa3ba2e12bbd047241fc8b7deb4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?=
<7645683+bruvzg@users.noreply.github.com>
Date: Mon, 11 Nov 2024 09:05:06 +0200
Subject: [PATCH] [iOS] Add options to specify additional entitlements and
capabilities in the export settings.
---
.../godot_ios/godot_ios.entitlements | 2 +-
.../doc_classes/EditorExportPlatformIOS.xml | 22 ++++++++++++---
platform/ios/export/export_plugin.cpp | 27 ++++++++++++++++---
.../doc_classes/EditorExportPlatformMacOS.xml | 10 +++----
4 files changed, 48 insertions(+), 13 deletions(-)
diff --git a/misc/dist/ios_xcode/godot_ios/godot_ios.entitlements b/misc/dist/ios_xcode/godot_ios/godot_ios.entitlements
index c9b58a85cf9..6a9e1af546e 100644
--- a/misc/dist/ios_xcode/godot_ios/godot_ios.entitlements
+++ b/misc/dist/ios_xcode/godot_ios/godot_ios.entitlements
@@ -2,6 +2,6 @@
-$entitlements_push_notifications
+$entitlements_full
diff --git a/platform/ios/doc_classes/EditorExportPlatformIOS.xml b/platform/ios/doc_classes/EditorExportPlatformIOS.xml
index 6d2c74d222a..5cf516f5307 100644
--- a/platform/ios/doc_classes/EditorExportPlatformIOS.xml
+++ b/platform/ios/doc_classes/EditorExportPlatformIOS.xml
@@ -84,6 +84,9 @@
If [code]true[/code], networking features related to Wi-Fi access are enabled. See [url=https://developer.apple.com/support/required-device-capabilities/]Required Device Capabilities[/url].
+
+ Additional data added to the [code]UIRequiredDeviceCapabilities[/code] array of the [code]Info.plist[/code] file.
+
Requires the graphics performance and features of the A12 Bionic and later chips (devices supporting all Vulkan renderer features).
Enabling this option limits supported devices to: iPhone XS, iPhone XR, iPad Mini (5th gen.), iPad Air (3rd gen.), iPad (8th gen) and newer.
@@ -92,15 +95,28 @@
Requires the graphics performance and features of the A17 Pro and later chips.
Enabling this option limits supported devices to: iPhone 15 Pro and newer.
-
- If [code]true[/code], push notifications are enabled. See [url=https://developer.apple.com/support/required-device-capabilities/]Required Device Capabilities[/url].
-
Path to the custom export template. If left empty, default template is used.
Path to the custom export template. If left empty, default template is used.
+
+ Additional data added to the root [code]<dict>[/code] section of the [url=https://developer.apple.com/documentation/bundleresources/entitlements].entitlements[/url] file. The value should be an XML section with pairs of key-value elements, for example:
+ [codeblock lang=text]
+ <key>key_name</key>
+ <string>value</string>
+ [/codeblock]
+
+
+ Enable to allow access to Game Center features. [url=https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_game-center]com.apple.developer.game-center[/url].
+
+
+ Enable if app may perform better with a higher memory limit. [url=https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_kernel_increased-memory-limit]com.apple.developer.kernel.increased-memory-limit[/url].
+
+
+ Environment for Apple Push Notification service. See [url=https://developer.apple.com/documentation/bundleresources/entitlements/aps-environment]aps-environment[/url].
+
App Store application icon file. If left empty, it will fallback to [member ProjectSettings.application/config/icon]. See [url=https://developer.apple.com/design/human-interface-guidelines/foundations/app-icons]App icons[/url].
diff --git a/platform/ios/export/export_plugin.cpp b/platform/ios/export/export_plugin.cpp
index 2b1b2e9c2c6..742127a10e1 100644
--- a/platform/ios/export/export_plugin.cpp
+++ b/platform/ios/export/export_plugin.cpp
@@ -328,10 +328,15 @@ void EditorExportPlatformIOS::get_export_options(List *r_options)
plugins_changed.clear();
plugins = found_plugins;
+ r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "entitlements/increased_memory_limit"), false));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "entitlements/game_center"), false));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "entitlements/push_notifications", PROPERTY_HINT_ENUM, "Disabled,Production,Development"), "Disabled"));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "entitlements/additional", PROPERTY_HINT_MULTILINE_TEXT), ""));
+
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "capabilities/access_wifi"), false));
- r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "capabilities/push_notifications"), false));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "capabilities/performance_gaming_tier"), false));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "capabilities/performance_a12"), false));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::PACKED_STRING_ARRAY, "capabilities/additional"), PackedStringArray()));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "user_data/accessible_from_files_app"), false));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "user_data/accessible_from_itunes_sharing"), false));
@@ -518,9 +523,20 @@ void EditorExportPlatformIOS::_fix_config_file(const Ref &p_
strnew += lines[i].replace("$docs_in_place", ((bool)p_preset->get("user_data/accessible_from_files_app")) ? "" : "") + "\n";
} else if (lines[i].contains("$docs_sharing")) {
strnew += lines[i].replace("$docs_sharing", ((bool)p_preset->get("user_data/accessible_from_itunes_sharing")) ? "" : "") + "\n";
- } else if (lines[i].contains("$entitlements_push_notifications")) {
- bool is_on = p_preset->get("capabilities/push_notifications");
- strnew += lines[i].replace("$entitlements_push_notifications", is_on ? "aps-environmentdevelopment" : "") + "\n";
+ } else if (lines[i].contains("$entitlements_full")) {
+ String entitlements;
+ if ((String)p_preset->get("entitlements/push_notifications") != "Disabled") {
+ entitlements += "aps-environment\n" + p_preset->get("entitlements/push_notifications").operator String().to_lower() + "" + "\n";
+ }
+ if ((bool)p_preset->get("entitlements/game_center")) {
+ entitlements += "com.apple.developer.game-center\n\n";
+ }
+ if ((bool)p_preset->get("entitlements/increased_memory_limit")) {
+ entitlements += "com.apple.developer.kernel.increased-memory-limit\n\n";
+ }
+ entitlements += p_preset->get("entitlements/additional").operator String() + "\n";
+
+ strnew += lines[i].replace("$entitlements_full", entitlements);
} else if (lines[i].contains("$required_device_capabilities")) {
String capabilities;
@@ -541,6 +557,9 @@ void EditorExportPlatformIOS::_fix_config_file(const Ref &p_
for (int idx = 0; idx < capabilities_list.size(); idx++) {
capabilities += "" + capabilities_list[idx] + "\n";
}
+ for (const String &cap : p_preset->get("capabilities/additional").operator PackedStringArray()) {
+ capabilities += "" + cap + "\n";
+ }
strnew += lines[i].replace("$required_device_capabilities", capabilities);
} else if (lines[i].contains("$interface_orientations")) {
diff --git a/platform/macos/doc_classes/EditorExportPlatformMacOS.xml b/platform/macos/doc_classes/EditorExportPlatformMacOS.xml
index dcaba9bbd25..802128dac6e 100644
--- a/platform/macos/doc_classes/EditorExportPlatformMacOS.xml
+++ b/platform/macos/doc_classes/EditorExportPlatformMacOS.xml
@@ -76,11 +76,11 @@
Array of the additional command line arguments passed to the code signing tool.
- Additional data added to the root [code]<dict>[/code] section of the [url=https://developer.apple.com/documentation/bundleresources/entitlements].entitlements[/url] file. The value should be an XML section with pairs of key-value elements, e.g.:
- [codeblock lang=text]
- <key>key_name</key>
- <string>value</string>
- [/codeblock]
+ Additional data added to the root [code]<dict>[/code] section of the [url=https://developer.apple.com/documentation/bundleresources/entitlements].entitlements[/url] file. The value should be an XML section with pairs of key-value elements, for example:
+ [codeblock lang=text]
+ <key>key_name</key>
+ <string>value</string>
+ [/codeblock]
Enable to allow access to contacts in the user's address book, if it's enabled you should also provide usage message in the [member privacy/address_book_usage_description] option. See [url=https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_personal-information_addressbook]com.apple.security.personal-information.addressbook[/url].