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.