# Guide iOS Flavor dan TestFlight AHSP

Guide ini melengkapi:

- [ios-build.yml](/d:/APP/LARAVEL_DEFAULT/AHSP/.github/workflows/ios-build.yml)
- [ios-signed-build.yml](/d:/APP/LARAVEL_DEFAULT/AHSP/.github/workflows/ios-signed-build.yml)
- [ios-testflight.yml](/d:/APP/LARAVEL_DEFAULT/AHSP/.github/workflows/ios-testflight.yml)
- [mobile_build.php](/d:/APP/LARAVEL_DEFAULT/AHSP/config/mobile_build.php)

## Konsep Baru

Sekarang konfigurasi iOS dibaca dari source Laravel repo, bukan lagi patch `project.pbxproj` saat CI.

Sumber utamanya:

- [mobile_build.php](/d:/APP/LARAVEL_DEFAULT/AHSP/config/mobile_build.php)
- [export_ios_flavor_config.php](/d:/APP/LARAVEL_DEFAULT/AHSP/scripts/export_ios_flavor_config.php)

File utamanya:

- [AppFlavor.xcconfig](/d:/APP/LARAVEL_DEFAULT/AHSP/attendance_mobile_client/ios/Flutter/AppFlavor.xcconfig)
- [AppConfig.production.xcconfig](/d:/APP/LARAVEL_DEFAULT/AHSP/attendance_mobile_client/ios/Flutter/AppConfig.production.xcconfig)
- [AppConfig.staging.xcconfig](/d:/APP/LARAVEL_DEFAULT/AHSP/attendance_mobile_client/ios/Flutter/AppConfig.staging.xcconfig)
- [AppConfig.common.xcconfig](/d:/APP/LARAVEL_DEFAULT/AHSP/attendance_mobile_client/ios/Flutter/AppConfig.common.xcconfig)

## Flavor yang Disiapkan

### Production

- display name: mengikuti `config/mobile_build.php`
- bundle id default: mengikuti `config/mobile_build.php`

### Staging

- display name: nama production + suffix `Staging`
- bundle id default: bundle id production + suffix `.staging`

Jika ingin ganti naming final perusahaan, ubah `config/mobile_build.php` atau env Laravel:

- `MOBILE_APP_NAME`
- `MOBILE_COMPANY_NAME`
- `MOBILE_IOS_APP_NAME`
- `MOBILE_IOS_BUNDLE_ID_BASE`
- `MOBILE_IOS_STAGING_SUFFIX`

## Bundle ID Permanen

`project.pbxproj` sekarang membaca:

```text
$(IOS_PRODUCT_BUNDLE_IDENTIFIER)
```

Jadi workflow CI tidak lagi perlu `sed` patch bundle id ke file project.

## Workflow yang Tersedia

### 1. Build IPA tanpa signing

Workflow:

- `Build iOS IPA AHSP`

Pilihan:

- `production`
- `staging`

Output:

- artifact `.ipa` no-codesign

### 2. Build IPA signed

Workflow:

- `Build Signed iOS IPA AHSP`

Pilihan:

- `production`
- `staging`
- `app-store / ad-hoc / development`

Output:

- artifact `.ipa` signed

### 3. Upload TestFlight

Workflow:

- `Upload iOS Build to TestFlight`

Mode:

- production only

Output:

- upload `.ipa` signed ke TestFlight

## Secrets Signed Build

Tetap diperlukan:

- `IOS_KEYCHAIN_PASSWORD`
- `IOS_CERTIFICATE_P12_BASE64`
- `IOS_CERTIFICATE_PASSWORD`
- `IOS_PROVISIONING_PROFILE_BASE64_PRODUCTION`
- `IOS_PROVISIONING_PROFILE_BASE64_STAGING`

## Secrets TestFlight

Tambahan untuk upload App Store Connect:

- `APP_STORE_CONNECT_ISSUER_ID`
- `APP_STORE_CONNECT_KEY_ID`
- `APP_STORE_CONNECT_PRIVATE_KEY`

## Cara Pakai Flavor

Workflow akan generate config aktif ke:

```text
attendance_mobile_client/ios/Flutter/AppFlavor.xcconfig
```

Ini aman karena:

- tidak mengubah Android
- tidak mengubah kode Dart
- hanya mengarahkan build iOS ke flavor yang dipilih
- source branding tetap satu arah dari Laravel repo

## Rekomendasi Operasional

### Untuk testing CI cepat

Gunakan:

- `Build iOS IPA AHSP`

### Untuk internal install device

Gunakan:

- `Build Signed iOS IPA AHSP`

### Untuk distribusi tester iPhone

Gunakan:

- `Upload iOS Build to TestFlight`

## Catatan

Kalau nanti Anda ingin flavor iOS juga dipisah sampai level:

- icon beda
- app name beda total
- API base URL beda bawaan

maka tahap berikutnya kita bisa lanjutkan dengan:

1. `dart-define` profile staging/production
2. app icon flavor
3. launch screen flavor
