From 2043b4a1cb053981b5629dd6dc34a6652890d0bf Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Tue, 18 Feb 2025 15:38:30 -0800 Subject: [PATCH] for 0.27.0 iOS packaging improved (#39) * Override serious_python * Fix yaml * Manual signing and provisioning profile * Introduce bundle_id and project_name * Fix dict checks * exportOptions.plist * Output all vars * Move .vars * Fix expor options template * Format template * Pyodide 0.27.2 * Add teamid * Added "ios_signing_certificate" var * serious_python:main * Fake run script to sign iOS bundle frameworks * Updated sign script * Explicitly sign .py files * Remove custom code signing * Use serious_python:resources branch * return to main * resources branch * Add build_arch for Android * Rename build_arch to target_arch * Fix target_arch def value * Hide target_arch inside options * serious_python:main * .plist to support arrays * Add closing if * fix template * Another template fix * Remove comments * macOS plist to support arrays --- cookiecutter.json | 12 +++-- {{cookiecutter.out_dir}}/.vars | 3 ++ .../android/app/build.gradle | 2 +- .../MainActivity.kt | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 45 +++++++++++----- .../ios/Runner/Info.plist | 39 ++++++++++---- .../ios/exportOptions.plist | 53 +++++++++++++++++++ {{cookiecutter.out_dir}}/linux/CMakeLists.txt | 2 +- .../macos/Runner.xcodeproj/project.pbxproj | 6 +-- .../macos/Runner/Configs/AppInfo.xcconfig | 2 +- .../macos/Runner/Info.plist | 39 ++++++++++---- {{cookiecutter.out_dir}}/pubspec.yaml | 6 +++ {{cookiecutter.out_dir}}/web/python-worker.js | 2 +- 13 files changed, 172 insertions(+), 41 deletions(-) create mode 100644 {{cookiecutter.out_dir}}/.vars create mode 100644 {{cookiecutter.out_dir}}/ios/exportOptions.plist diff --git a/cookiecutter.json b/cookiecutter.json index c8698eb..8fc8547 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -5,14 +5,20 @@ "project_name_slug": "", "project_description": "", "product_name": "{{ cookiecutter.project_name }}", - "org_name": "com.flet", + "org_name": "{{ cookiecutter.org_name if 'org_name' in cookiecutter else cookiecutter.bundle_id.rsplit('.', 1)[0] if 'bundle_id' in cookiecutter else 'com.flet' }}", "company_name": "Your Company", "copyright": "Copyright (c) 2023 Your Company", "flutter": null, "sep": "/", - "kotlin_dir": "{{ cookiecutter.org_name.replace('.', cookiecutter.sep) }}{{ cookiecutter.sep }}{{ cookiecutter.project_name }}{{ cookiecutter.sep }}", "hide_loading_animation": true, - "team_id": "", + "bundle_id": "{{ cookiecutter.bundle_id if 'bundle_id' in cookiecutter else cookiecutter.org_name + '.' + cookiecutter.project_name }}", + "ios_provisioning_profile": "", + "ios_export_method": "", + "ios_signing_certificate": "", + "ios_export_options": {}, + "ios_team_id": "", + "package_name": "{{ cookiecutter.bundle_id.rsplit('.', 1)[-1].replace('-', '_') if 'bundle_id' in cookiecutter else cookiecutter.project_name }}", + "kotlin_dir": "{{ cookiecutter.org_name.replace('.', cookiecutter.sep) }}{{ cookiecutter.sep }}{{ cookiecutter.package_name }}{{ cookiecutter.sep }}", "base_url": "/", "route_url_strategy": "path", "web_renderer": "canvaskit", diff --git a/{{cookiecutter.out_dir}}/.vars b/{{cookiecutter.out_dir}}/.vars new file mode 100644 index 0000000..f281c74 --- /dev/null +++ b/{{cookiecutter.out_dir}}/.vars @@ -0,0 +1,3 @@ +{% for key, value in cookiecutter.items() -%} +{{ key }}: {{ value }} +{% endfor %} \ No newline at end of file diff --git a/{{cookiecutter.out_dir}}/android/app/build.gradle b/{{cookiecutter.out_dir}}/android/app/build.gradle index 9203e8e..7ac30b3 100644 --- a/{{cookiecutter.out_dir}}/android/app/build.gradle +++ b/{{cookiecutter.out_dir}}/android/app/build.gradle @@ -50,7 +50,7 @@ android { } defaultConfig { - applicationId "{{ cookiecutter.org_name }}.{{ cookiecutter.project_name }}" + applicationId "{{ cookiecutter.bundle_id }}" minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() diff --git a/{{cookiecutter.out_dir}}/android/app/src/main/kotlin/{{ cookiecutter.kotlin_dir }}/MainActivity.kt b/{{cookiecutter.out_dir}}/android/app/src/main/kotlin/{{ cookiecutter.kotlin_dir }}/MainActivity.kt index 475f684..aa1cf92 100644 --- a/{{cookiecutter.out_dir}}/android/app/src/main/kotlin/{{ cookiecutter.kotlin_dir }}/MainActivity.kt +++ b/{{cookiecutter.out_dir}}/android/app/src/main/kotlin/{{ cookiecutter.kotlin_dir }}/MainActivity.kt @@ -1,4 +1,4 @@ -package {{ cookiecutter.org_name }}.{{ cookiecutter.project_name }} +package {{ cookiecutter.org_name }}.{{ cookiecutter.package_name }} import io.flutter.embedding.android.FlutterActivity diff --git a/{{cookiecutter.out_dir}}/ios/Runner.xcodeproj/project.pbxproj b/{{cookiecutter.out_dir}}/ios/Runner.xcodeproj/project.pbxproj index f960c3f..bf800f6 100644 --- a/{{cookiecutter.out_dir}}/ios/Runner.xcodeproj/project.pbxproj +++ b/{{cookiecutter.out_dir}}/ios/Runner.xcodeproj/project.pbxproj @@ -360,9 +360,16 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; -{% if cookiecutter.team_id %} - DEVELOPMENT_TEAM = {{ cookiecutter.team_id }}; +{% if cookiecutter.ios_team_id %} + DEVELOPMENT_TEAM = "{{ cookiecutter.ios_team_id }}"; +{% endif %} +{% if cookiecutter.ios_signing_certificate %} + CODE_SIGN_IDENTITY = "{{ cookiecutter.ios_signing_certificate }}"; +{% endif %} +{% if cookiecutter.ios_provisioning_profile %} + PROVISIONING_PROFILE_SPECIFIER = "{{ cookiecutter.ios_provisioning_profile }}"; {% endif %} ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -370,7 +377,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.org_name }}.{{ cookiecutter.project_name_slug }}; + PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.bundle_id }}; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -387,7 +394,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.org_name }}.{{ cookiecutter.project_name_slug }}.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.bundle_id }}.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -405,7 +412,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.org_name }}.{{ cookiecutter.project_name_slug }}.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.bundle_id }}.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -421,7 +428,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.org_name }}.{{ cookiecutter.project_name_slug }}.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.bundle_id }}.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -541,9 +548,16 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; -{% if cookiecutter.team_id %} - DEVELOPMENT_TEAM = {{ cookiecutter.team_id }}; +{% if cookiecutter.ios_team_id %} + DEVELOPMENT_TEAM = "{{ cookiecutter.ios_team_id }}"; +{% endif %} +{% if cookiecutter.ios_signing_certificate %} + CODE_SIGN_IDENTITY = "{{ cookiecutter.ios_signing_certificate }}"; +{% endif %} +{% if cookiecutter.ios_provisioning_profile %} + PROVISIONING_PROFILE_SPECIFIER = "{{ cookiecutter.ios_provisioning_profile }}"; {% endif %} ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -551,7 +565,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.org_name }}.{{ cookiecutter.project_name_slug }}; + PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.bundle_id }}; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -566,9 +580,16 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; -{% if cookiecutter.team_id %} - DEVELOPMENT_TEAM = {{ cookiecutter.team_id }}; +{% if cookiecutter.ios_team_id %} + DEVELOPMENT_TEAM = "{{ cookiecutter.ios_team_id }}"; +{% endif %} +{% if cookiecutter.ios_signing_certificate %} + CODE_SIGN_IDENTITY = "{{ cookiecutter.ios_signing_certificate }}"; +{% endif %} +{% if cookiecutter.ios_provisioning_profile %} + PROVISIONING_PROFILE_SPECIFIER = "{{ cookiecutter.ios_provisioning_profile }}"; {% endif %} ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -576,7 +597,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.org_name }}.{{ cookiecutter.project_name_slug }}; + PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.bundle_id }}; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/{{cookiecutter.out_dir}}/ios/Runner/Info.plist b/{{cookiecutter.out_dir}}/ios/Runner/Info.plist index f223752..7e7c62f 100644 --- a/{{cookiecutter.out_dir}}/ios/Runner/Info.plist +++ b/{{cookiecutter.out_dir}}/ios/Runner/Info.plist @@ -67,14 +67,35 @@ - - {{ k }} - - - - - - {{ v }} - + + {% macro render_dict(d) -%} + {% for key, value in d.items() -%} + {{ key }} + {% if value is string -%} + {{ value }} + {% elif value is boolean -%} + <{{ "true" if value else "false" }}/> + {% elif value is mapping -%} + + {{ render_dict(value) }} + + {% elif value is sequence -%} {# Support for lists/arrays #} + + {% for item in value -%} + {% if item is string -%} + {{ item }} + {% elif item is boolean -%} + <{{ "true" if item else "false" }}/> + {% elif item is mapping -%} + + {{ render_dict(item) }} + + {% endif -%} + {% endfor -%} + + {% endif -%} + {% endfor -%} + {% endmacro -%} + {{ render_dict(cookiecutter.options.info_plist) }} \ No newline at end of file diff --git a/{{cookiecutter.out_dir}}/ios/exportOptions.plist b/{{cookiecutter.out_dir}}/ios/exportOptions.plist new file mode 100644 index 0000000..9ae38f0 --- /dev/null +++ b/{{cookiecutter.out_dir}}/ios/exportOptions.plist @@ -0,0 +1,53 @@ + + + + + method + {{ cookiecutter.ios_export_method }} + provisioningProfiles + + {{ cookiecutter.bundle_id }} + {{ cookiecutter.ios_provisioning_profile }} + + + {% if cookiecutter.ios_team_id %} + teamID + {{ cookiecutter.ios_team_id }} + {% endif %} + + {% if cookiecutter.ios_signing_certificate %} + signingCertificate + {{ cookiecutter.ios_signing_certificate }} + {% endif %} + + {% macro render_dict(d) -%} + {% for key, value in d.items() -%} + {{ key }} + {% if value is string -%} + {{ value }} + {% elif value is boolean -%} + <{{ "true" if value else "false" }}/> + {% elif value is mapping -%} + + {{ render_dict(value) }} + + {% elif value is sequence -%} {# Support for lists/arrays #} + + {% for item in value -%} + {% if item is string -%} + {{ item }} + {% elif item is boolean -%} + <{{ "true" if item else "false" }}/> + {% elif item is mapping -%} + + {{ render_dict(item) }} + + {% endif -%} + {% endfor -%} + + {% endif -%} + {% endfor -%} + {% endmacro -%} + {{ render_dict(cookiecutter.ios_export_options) }} + + \ No newline at end of file diff --git a/{{cookiecutter.out_dir}}/linux/CMakeLists.txt b/{{cookiecutter.out_dir}}/linux/CMakeLists.txt index 1bc35a9..7fd9a43 100644 --- a/{{cookiecutter.out_dir}}/linux/CMakeLists.txt +++ b/{{cookiecutter.out_dir}}/linux/CMakeLists.txt @@ -7,7 +7,7 @@ project(runner LANGUAGES CXX) set(BINARY_NAME "{{ cookiecutter.project_name }}") # The unique GTK application identifier for this application. See: # https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "{{ cookiecutter.org_name }}.{{ cookiecutter.project_name }}") +set(APPLICATION_ID "{{ cookiecutter.bundle_id }}") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/{{cookiecutter.out_dir}}/macos/Runner.xcodeproj/project.pbxproj b/{{cookiecutter.out_dir}}/macos/Runner.xcodeproj/project.pbxproj index 45c4d7f..a044226 100644 --- a/{{cookiecutter.out_dir}}/macos/Runner.xcodeproj/project.pbxproj +++ b/{{cookiecutter.out_dir}}/macos/Runner.xcodeproj/project.pbxproj @@ -384,7 +384,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.org_name }}.{{ cookiecutter.project_name_slug }}.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.bundle_id }}.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/{{ cookiecutter.project_name }}.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/{{ cookiecutter.project_name }}"; @@ -398,7 +398,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.org_name }}.{{ cookiecutter.project_name_slug }}.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.bundle_id }}.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/{{ cookiecutter.project_name }}.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/{{ cookiecutter.project_name }}"; @@ -412,7 +412,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.org_name }}.{{ cookiecutter.project_name_slug }}.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.bundle_id }}.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/{{ cookiecutter.project_name }}.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/{{ cookiecutter.project_name }}"; diff --git a/{{cookiecutter.out_dir}}/macos/Runner/Configs/AppInfo.xcconfig b/{{cookiecutter.out_dir}}/macos/Runner/Configs/AppInfo.xcconfig index e90e552..673a8f3 100644 --- a/{{cookiecutter.out_dir}}/macos/Runner/Configs/AppInfo.xcconfig +++ b/{{cookiecutter.out_dir}}/macos/Runner/Configs/AppInfo.xcconfig @@ -8,7 +8,7 @@ PRODUCT_NAME = {{ cookiecutter.product_name }} // The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.org_name }}.{{ cookiecutter.project_name_slug }} +PRODUCT_BUNDLE_IDENTIFIER = {{ cookiecutter.bundle_id }} // The copyright displayed in application information PRODUCT_COPYRIGHT = {{ cookiecutter.copyright }}. All rights reserved. diff --git a/{{cookiecutter.out_dir}}/macos/Runner/Info.plist b/{{cookiecutter.out_dir}}/macos/Runner/Info.plist index 7e273e2..a87e6be 100644 --- a/{{cookiecutter.out_dir}}/macos/Runner/Info.plist +++ b/{{cookiecutter.out_dir}}/macos/Runner/Info.plist @@ -28,14 +28,35 @@ MainMenu NSPrincipalClass NSApplication - - {{ k }} - - - - - - {{ v }} - + + {% macro render_dict(d) -%} + {% for key, value in d.items() -%} + {{ key }} + {% if value is string -%} + {{ value }} + {% elif value is boolean -%} + <{{ "true" if value else "false" }}/> + {% elif value is mapping -%} + + {{ render_dict(value) }} + + {% elif value is sequence -%} {# Support for lists/arrays #} + + {% for item in value -%} + {% if item is string -%} + {{ item }} + {% elif item is boolean -%} + <{{ "true" if item else "false" }}/> + {% elif item is mapping -%} + + {{ render_dict(item) }} + + {% endif -%} + {% endfor -%} + + {% endif -%} + {% endfor -%} + {% endmacro -%} + {{ render_dict(cookiecutter.options.info_plist) }} \ No newline at end of file diff --git a/{{cookiecutter.out_dir}}/pubspec.yaml b/{{cookiecutter.out_dir}}/pubspec.yaml index fd81986..1b24125 100644 --- a/{{cookiecutter.out_dir}}/pubspec.yaml +++ b/{{cookiecutter.out_dir}}/pubspec.yaml @@ -28,6 +28,12 @@ dependency_overrides: # ref: main # url: https://github.com/flet-dev/flet.git + serious_python: + git: + url: https://github.com/flet-dev/serious-python.git + ref: main + path: src/serious_python + wakelock_plus: ^1.2.10 web: ^1.0.0 window_manager: ^0.4.3 diff --git a/{{cookiecutter.out_dir}}/web/python-worker.js b/{{cookiecutter.out_dir}}/web/python-worker.js index 463c036..81a7ba0 100644 --- a/{{cookiecutter.out_dir}}/web/python-worker.js +++ b/{{cookiecutter.out_dir}}/web/python-worker.js @@ -1,4 +1,4 @@ -importScripts("https://cdn.jsdelivr.net/pyodide/v0.26.2/full/pyodide.js"); +importScripts("https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.js"); self.pythonModuleName = null; self.initialized = false;