From 8f0a5d3fb5bdcd5c25b8126b959938fac1f2ef3c Mon Sep 17 00:00:00 2001 From: efrilm Date: Thu, 1 Oct 2026 10:48:25 +0700 Subject: [PATCH] update --- .github/workflows/ios.yml | 150 ++++ android/app/build.gradle.kts | 4 +- .../enaklocustomer}/MainActivity.kt | 4 +- .../reports/problems/problems-report.html | 663 ++++++++++++++++++ ios/ExportOptions.plist | 36 + ios/Flutter/AppFrameworkInfo.plist | 2 +- ios/Podfile | 9 +- ios/Runner.xcodeproj/project.pbxproj | 18 +- .../pages/webview/webview_page.dart | 2 +- linux/CMakeLists.txt | 2 +- macos/Runner.xcodeproj/project.pbxproj | 6 +- macos/Runner/Configs/AppInfo.xcconfig | 2 +- 12 files changed, 877 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/ios.yml rename android/app/src/main/kotlin/com/{example/enaklo => apskel/enaklocustomer}/MainActivity.kt (92%) create mode 100644 android/build/reports/problems/problems-report.html create mode 100644 ios/ExportOptions.plist diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml new file mode 100644 index 0000000..bfa1806 --- /dev/null +++ b/.github/workflows/ios.yml @@ -0,0 +1,150 @@ +name: Build & Deploy iOS to TestFlight + +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + build-and-deploy: + runs-on: macos-26 + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + channel: "stable" + # Dipin biar CI nggak ikut naik versi diam-diam. + # Flutter 3.47 mensyaratkan iOS deployment target minimal 15.0. + flutter-version: "3.47.0" + cache: true + + - name: Install Dependencies + run: flutter pub get + + # ── Code Signing Setup ────────────────────────────────────────────────── + + - name: Install Apple Certificate + env: + BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} + P12_PASSWORD: ${{ secrets.P12_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + run: | + CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 + echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH + + KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db + security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + security set-keychain-settings -lut 21600 $KEYCHAIN_PATH + security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + + security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A \ + -t cert -f pkcs12 -k $KEYCHAIN_PATH + security set-key-partition-list -S apple-tool:,apple: \ + -s -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + security list-keychain -d user -s $KEYCHAIN_PATH + + - name: Install Provisioning Profile + env: + BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }} + run: | + PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision + echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH + + mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles + + # Xcode requires the filename to be the profile's UUID + UUID=$(security cms -D -i $PP_PATH | plutil -extract UUID raw -) + cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles/$UUID.mobileprovision + echo "Installed provisioning profile UUID: $UUID" + + # ── Disable SPM ───────────────────────────────────────────────────────── + + - name: Disable Swift Package Manager + run: flutter config --no-enable-swift-package-manager + + # ── CocoaPods ─────────────────────────────────────────────────────────── + + - name: Install CocoaPods Dependencies + run: | + cd ios + rm -rf Pods Podfile.lock + pod install --repo-update + + # ── Build & Archive ───────────────────────────────────────────────────── + + - name: Build iOS (no codesign) + run: flutter build ios --release --no-codesign + + - name: Re-run pod install to apply Podfile signing settings + run: | + cd ios + pod install + + - name: Archive with Xcode + env: + TEAM_ID: ${{ secrets.TEAM_ID }} + run: | + cat > $RUNNER_TEMP/signing.xcconfig << 'XCCONFIG' + CODE_SIGN_STYLE = Manual + CODE_SIGN_IDENTITY = iPhone Distribution + PROVISIONING_PROFILE_SPECIFIER = Enaklo App Store + CODE_SIGNING_REQUIRED = YES + XCCONFIG + + xcodebuild archive \ + -workspace ios/Runner.xcworkspace \ + -scheme Runner \ + -configuration Release \ + -archivePath $RUNNER_TEMP/Runner.xcarchive \ + -destination "generic/platform=iOS" \ + -xcconfig $RUNNER_TEMP/signing.xcconfig \ + DEVELOPMENT_TEAM="$TEAM_ID" + + - name: Export IPA + run: | + xcodebuild -exportArchive \ + -archivePath $RUNNER_TEMP/Runner.xcarchive \ + -exportPath $RUNNER_TEMP/export \ + -exportOptionsPlist ios/ExportOptions.plist + + mkdir -p build/ios/ipa + cp $RUNNER_TEMP/export/*.ipa build/ios/ipa/ + + # ── Upload to TestFlight ──────────────────────────────────────────────── + + - name: Upload to TestFlight via Transporter + env: + APPLE_ID: ${{ secrets.APPLE_ID }} + APP_SPECIFIC_PASSWORD: ${{ secrets.APP_SPECIFIC_PASSWORD }} + run: | + IPA_PATH=$(find build/ios/ipa -name "*.ipa" | head -1) + echo "Uploading: $IPA_PATH" + xcrun altool --upload-app \ + --type ios \ + --file "$IPA_PATH" \ + --username "$APPLE_ID" \ + --password "$APP_SPECIFIC_PASSWORD" \ + --verbose + + # ── Cleanup ───────────────────────────────────────────────────────────── + + - name: Clean Up Keychain and Provisioning Profile + if: ${{ always() }} + run: | + security delete-keychain $RUNNER_TEMP/app-signing.keychain-db || true + rm -rf ~/Library/MobileDevice/Provisioning\ Profiles/*.mobileprovision || true + + # ── Artifact ──────────────────────────────────────────────────────────── + + - name: Upload IPA as Artifact + if: always() + uses: actions/upload-artifact@v4 + with: + name: ios-ipa + path: build/ios/ipa/*.ipa + retention-days: 7 diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 0ff489c..5100454 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } android { - namespace = "com.appskel.enaklo" + namespace = "com.apskel.enaklocustomer" compileSdk = flutter.compileSdkVersion ndkVersion = "27.0.12077973" @@ -21,7 +21,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.appskel.enaklo" + applicationId = "com.apskel.enaklocustomer" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion diff --git a/android/app/src/main/kotlin/com/example/enaklo/MainActivity.kt b/android/app/src/main/kotlin/com/apskel/enaklocustomer/MainActivity.kt similarity index 92% rename from android/app/src/main/kotlin/com/example/enaklo/MainActivity.kt rename to android/app/src/main/kotlin/com/apskel/enaklocustomer/MainActivity.kt index e0856de..227117b 100644 --- a/android/app/src/main/kotlin/com/example/enaklo/MainActivity.kt +++ b/android/app/src/main/kotlin/com/apskel/enaklocustomer/MainActivity.kt @@ -1,4 +1,4 @@ -package com.appskel.enaklo +package com.apskel.enaklocustomer import android.os.Build import io.flutter.embedding.android.FlutterActivity @@ -31,6 +31,6 @@ class MainActivity : FlutterActivity() { } private companion object { - const val WEBVIEW_CHANNEL = "com.appskel.enaklo/webview" + const val WEBVIEW_CHANNEL = "com.apskel.enaklocustomer/webview" } } diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html new file mode 100644 index 0000000..d098403 --- /dev/null +++ b/android/build/reports/problems/problems-report.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Gradle Configuration Cache + + + +
+ +
+ Loading... +
+ + + + + + diff --git a/ios/ExportOptions.plist b/ios/ExportOptions.plist new file mode 100644 index 0000000..c1a3901 --- /dev/null +++ b/ios/ExportOptions.plist @@ -0,0 +1,36 @@ + + + + + + method + app-store-connect + + + teamID + 5TRC3M8UZG + + + signingStyle + manual + + + provisioningProfiles + + com.apskel.enaklocustomer + Enaklo App Store + + + stripSwiftSymbols + + + uploadBitcode + + + uploadSymbols + + + compileBitcode + + + diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 7c56964..0d14080 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 12.0 + 15.0 diff --git a/ios/Podfile b/ios/Podfile index e549ee2..6b8f3cb 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '12.0' +platform :ios, '15.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -39,5 +39,12 @@ end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0' + # Disable code signing for all Pod targets — only Runner needs signing + config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' + config.build_settings['CODE_SIGNING_REQUIRED'] = 'NO' + config.build_settings['CODE_SIGN_IDENTITY'] = '' + end end end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index daae6ee..9eb2d77 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -346,7 +346,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -368,7 +368,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.appskel.enaklo; + PRODUCT_BUNDLE_IDENTIFIER = com.apskel.enaklocustomer; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -384,7 +384,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.appskel.enaklo.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.apskel.enaklocustomer.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -401,7 +401,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.appskel.enaklo.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.apskel.enaklocustomer.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -416,7 +416,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.appskel.enaklo.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.apskel.enaklocustomer.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -472,7 +472,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -523,7 +523,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -547,7 +547,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.appskel.enaklo; + PRODUCT_BUNDLE_IDENTIFIER = com.apskel.enaklocustomer; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -569,7 +569,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.appskel.enaklo; + PRODUCT_BUNDLE_IDENTIFIER = com.apskel.enaklocustomer; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/lib/presentation/pages/webview/webview_page.dart b/lib/presentation/pages/webview/webview_page.dart index 26a57f7..dbf2262 100644 --- a/lib/presentation/pages/webview/webview_page.dart +++ b/lib/presentation/pages/webview/webview_page.dart @@ -41,7 +41,7 @@ class WebViewPage extends StatefulWidget { } class _WebViewPageState extends State { - static const _nativeChannel = MethodChannel('com.appskel.enaklo/webview'); + static const _nativeChannel = MethodChannel('com.apskel.enaklocustomer/webview'); late final WebViewController _controller; diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 1b34b4c..c1e0f28 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -7,7 +7,7 @@ project(runner LANGUAGES CXX) set(BINARY_NAME "enaklo") # The unique GTK application identifier for this application. See: # https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.appskel.enaklo") +set(APPLICATION_ID "com.apskel.enaklocustomer") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index ee2d4d6..8b0e276 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -385,7 +385,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.appskel.enaklo.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.apskel.enaklocustomer.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/enaklo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/enaklo"; @@ -399,7 +399,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.appskel.enaklo.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.apskel.enaklocustomer.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/enaklo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/enaklo"; @@ -413,7 +413,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.appskel.enaklo.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.apskel.enaklocustomer.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/enaklo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/enaklo"; diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig index 40318f8..188704b 100644 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -8,7 +8,7 @@ PRODUCT_NAME = enaklo // The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.appskel.enaklo +PRODUCT_BUNDLE_IDENTIFIER = com.apskel.enaklocustomer // The copyright displayed in application information PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved.