Merge pull request #7 from Michall00/feat/improve-ui #206
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: iOS-ipa-build | |
| on: | |
| push: | |
| branches: [ master, develop ] | |
| pull_request: | |
| branches: [ master ] | |
| workflow_dispatch: | |
| jobs: | |
| build-ios: | |
| name: 🎉 iOS Build | |
| runs-on: macos-latest | |
| steps: | |
| - uses: actions/checkout@v3 | |
| - uses: subosito/flutter-action@v2 | |
| with: | |
| channel: stable | |
| architecture: x64 | |
| - run: flutter pub get | |
| - name: Install Firebase CLI | |
| run: | | |
| curl -sL https://firebase.tools | bash | |
| - name: Generate firebase_app_id_file.json | |
| run: | | |
| cat > ios/firebase_app_id_file.json <<EOF | |
| { | |
| "app_id": "${{ secrets.FIREBASE_APP_ID }}", | |
| "api_key": "${{ secrets.FIREBASE_API_KEY }}", | |
| "project_id": "${{ secrets.FIREBASE_PROJECT_ID }}" | |
| } | |
| EOF | |
| - name: Decode GoogleService-Info.plist | |
| run: | | |
| echo "${{ secrets.GOOGLE_SERVICE_INFO_PLIST_BASE64 }}" | base64 --decode > ios/Runner/GoogleService-Info.plist | |
| - name: Generate firebase_options.dart | |
| run: | | |
| dart pub global activate flutterfire_cli | |
| echo "$HOME/.pub-cache/bin" >> $GITHUB_PATH | |
| flutterfire configure --project=${{ secrets.FIREBASE_PROJECT_ID }} --platforms=ios --out=lib/firebase_options.dart --yes | |
| env: | |
| FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }} | |
| - name: Ensure Podfile with iOS 13.0 | |
| run: | | |
| cd ios | |
| if [ ! -f Podfile ]; then | |
| pod init | |
| fi | |
| if grep -q "^platform :ios" Podfile; then | |
| sed -i '' 's/^platform :ios.*/platform :ios, '\''13.0'\''/' Podfile | |
| else | |
| sed -i '' '1s;^;platform :ios, '\''13.0'\''\n;' Podfile | |
| fi | |
| - name: Install CocoaPods | |
| run: | | |
| cd ios | |
| pod install | |
| - name: Force no-codesign in xcconfig (Runner) | |
| run: | | |
| for cfg in Debug Release Profile; do | |
| xc="ios/Flutter/${cfg}.xcconfig" | |
| { | |
| echo ""; | |
| echo "CODE_SIGNING_ALLOWED=NO"; | |
| echo "CODE_SIGNING_REQUIRED=NO"; | |
| echo "CODE_SIGN_STYLE=Manual"; | |
| echo "DEVELOPMENT_TEAM="; | |
| echo "PROVISIONING_PROFILE_SPECIFIER="; | |
| echo "CODE_SIGN_IDENTITY="; | |
| echo "CODE_SIGN_ENTITLEMENTS="; | |
| echo "CODE_SIGN_INJECT_BASE_ENTITLEMENTS=NO"; | |
| echo "IPHONEOS_DEPLOYMENT_TARGET=13.0"; | |
| echo "GCC_TREAT_WARNINGS_AS_ERRORS=NO"; | |
| echo "SWIFT_COMPILATION_MODE=wholemodule"; | |
| echo "ONLY_ACTIVE_ARCH=NO"; | |
| } >> "$xc" | |
| done | |
| - name: Show build settings (sanity check) | |
| run: | | |
| xcodebuild -workspace ios/Runner.xcworkspace -scheme Runner -configuration Release -showBuildSettings | \ | |
| egrep "CODE_SIGN|DEVELOPMENT_TEAM|PRODUCT_BUNDLE_IDENTIFIER|IPHONEOS_DEPLOYMENT_TARGET" | |
| - name: Flutter generate Xcode project | |
| run: flutter build ios --release --no-codesign --config-only | |
| - name: Resolve SPM | |
| run: | | |
| xcodebuild -resolvePackageDependencies \ | |
| -workspace ios/Runner.xcworkspace \ | |
| -scheme Runner | |
| - name: Build with xcodebuild (no signing, verbose) | |
| run: | | |
| set -euo pipefail | |
| xcodebuild \ | |
| -workspace ios/Runner.xcworkspace \ | |
| -scheme Runner \ | |
| -configuration Release \ | |
| -sdk iphoneos \ | |
| -destination 'generic/platform=iOS' \ | |
| -derivedDataPath build/ios/DerivedData \ | |
| CODE_SIGNING_ALLOWED=NO \ | |
| CODE_SIGNING_REQUIRED=NO \ | |
| CODE_SIGN_STYLE=Manual \ | |
| CODE_SIGN_IDENTITY= \ | |
| DEVELOPMENT_TEAM= \ | |
| PROVISIONING_PROFILE_SPECIFIER= \ | |
| CODE_SIGN_ENTITLEMENTS= \ | |
| CODE_SIGN_INJECT_BASE_ENTITLEMENTS=NO \ | |
| OTHER_CODE_SIGN_FLAGS= \ | |
| SWIFT_COMPILATION_MODE=wholemodule \ | |
| ONLY_ACTIVE_ARCH=NO \ | |
| build | tee xcodebuild.log | |
| echo "———— Errors ————" | |
| (grep -n -E "error:|fatal error:" -n xcodebuild.log || true) | |
| - name: Upload Xcode log (artifact) | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: xcodebuild-log | |
| path: xcodebuild.log | |
| - name: Locate build artifacts | |
| id: locate | |
| run: | | |
| APP_PATH=$(find build/ios/DerivedData -type d -path "*/Build/Products/Release-iphoneos/Runner.app" | head -n1) | |
| DSYM_PATH=$(find build/ios/DerivedData -type d -path "*/Build/Products/Release-iphoneos/Runner.app.dSYM" | head -n1) | |
| echo "app_path=$APP_PATH" >> $GITHUB_OUTPUT | |
| echo "dsym_path=$DSYM_PATH" >> $GITHUB_OUTPUT | |
| test -d "$APP_PATH" || (echo "Runner.app not found"; exit 1) | |
| - name: Check UUIDs | |
| if: ${{ steps.locate.outputs.dsym_path != '' }} | |
| run: | | |
| APP_UUID=$(dwarfdump --uuid "${{ steps.locate.outputs.app_path }}/Runner" | grep '(arm64)' | awk '{print $2}') | |
| DSYM_UUID=$(dwarfdump --uuid "${{ steps.locate.outputs.dsym_path }}" | grep '(arm64)' | awk '{print $2}') | |
| echo "APP_UUID=$APP_UUID" | |
| echo "DSYM_UUID=$DSYM_UUID" | |
| [ "$APP_UUID" = "$DSYM_UUID" ] | |
| - name: Upload dSYM to Crashlytics | |
| run: | | |
| if [[ -d "${{ steps.locate.outputs.dsym_path }}" ]]; then | |
| ./ios/Pods/FirebaseCrashlytics/upload-symbols \ | |
| -gsp ios/Runner/GoogleService-Info.plist \ | |
| -p ios "${{ steps.locate.outputs.dsym_path }}" | |
| else | |
| echo "No dSYM found, skipping Crashlytics upload." | |
| fi | |
| - name: Package IPA | |
| run: | | |
| set -e | |
| rm -rf payload_tmp FlutterIpaExport.ipa | |
| mkdir -p payload_tmp/Payload | |
| cp -R "${{ steps.locate.outputs.app_path }}" "payload_tmp/Payload/Runner.app" | |
| (cd payload_tmp && /usr/bin/zip -qry ../FlutterIpaExport.ipa Payload) | |
| - name: Upload binaries to release | |
| uses: svenstaro/upload-release-action@v2 | |
| with: | |
| repo_token: ${{ secrets.GITHUB_TOKEN }} | |
| file: FlutterIpaExport.ipa | |
| tag: v1.0.${{ github.run_number }} | |
| overwrite: true | |
| body: "Unsigned IPA build" |