feat(ios): support iPhone/iPad avec build d'un IPA sideloadable

Le projet était Android-only : le dossier ios/ avait été supprimé et aucune
cible Apple n'existait. Le code Dart, lui, est resté portable (aucun appel
spécifique à Android) et media_kit_libs_video embarque déjà libmpv pour iOS.

- scripts/prepare_ios.sh régénère le projet Xcode via `flutter create` puis
  applique les réglages nécessaires à une app IPTV : exception App Transport
  Security (les serveurs Xtream sont en http:// simple), audio en arrière-plan,
  orientations paysage et 4 sens sur iPad, autorisation réseau local, cible
  iOS 13 exigée par media_kit et bundle id aligné sur l'applicationId Android.
  Le script est idempotent et respecte un dossier ios/ déjà versionné.
- Nouveau workflow Build iOS : runner macOS, build --no-codesign, empaquetage
  en IPA non signé publié sur la Release de la version, à côté de l'APK.
  Pas de déclenchement sur les PR, un runner macOS coûtant 10x en minutes.
- IOS_GUIDE.md documente les voies d'installation hors App Store (AltStore /
  SideStore, Sideloadly, compte développeur, TestFlight) et leurs limites.
- flutter_launcher_icons : image_path pointait sur app-icon.png, absent du
  dépôt ; correction vers le logo existant et ajout de la génération iOS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WoXgHivbAphDk9ArgKDg8Q
This commit is contained in:
Claude committed 2026-09-09 16:28:02 +00:00
1 parent 186f9f89f9
commit 26bf240b76
7 files changed
+356 -5

No files matched your search

+76
View File
@@ -0,0 +1,76 @@
# Construit un IPA *non signé* pour iPhone / iPad et le publie sur la GitHub
# Release de la version courante, à côté de l'APK Android.
#
# L'IPA n'est volontairement pas signé : la signature est faite au moment de
# l'installation par AltStore / SideStore / Sideloadly avec l'Apple ID de
# l'utilisateur (voir IOS_GUIDE.md). Aucun compte développeur n'est donc
# nécessaire pour produire ce fichier.
#
# Le job tourne sur un runner macOS (Xcode obligatoire) et consomme 10x plus
# de minutes GitHub Actions qu'un runner Linux : il n'est donc pas déclenché
# sur les pull requests.
name: Build iOS
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: write
jobs:
build:
runs-on: macos-15
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: 3.35.3
cache: true
- name: Read app version from pubspec.yaml
id: version
run: echo "version=$(grep '^version:' pubspec.yaml | awk '{print $2}' | cut -d+ -f1)" >> "$GITHUB_OUTPUT"
- run: flutter pub get
# Régénère ios/ (absent du dépôt) et applique les réglages IPTV :
# ATS, audio en arrière-plan, orientations iPad, bundle id.
- name: Prepare iOS project
run: ./scripts/prepare_ios.sh
- name: Generate iOS app icon
run: dart run flutter_launcher_icons -f flutter_launcher_icons-ios.yaml
- name: Build release app (unsigned)
run: flutter build ios --release --no-codesign
# Un IPA n'est qu'une archive zip contenant Payload/<App>.app.
- name: Package unsigned IPA
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
cd build/ios/iphoneos
rm -rf Payload
mkdir Payload
cp -R Runner.app Payload/
zip -qry "$GITHUB_WORKSPACE/xtremobile-v${VERSION}-unsigned.ipa" Payload
- name: Upload IPA artifact
uses: actions/upload-artifact@v4
with:
name: xtremobile-v${{ steps.version.outputs.version }}-ipa
path: xtremobile-v${{ steps.version.outputs.version }}-unsigned.ipa
# Même tag que le workflow APK : l'IPA est ajouté à la release existante.
- name: Publish GitHub Release
if: github.ref == 'refs/heads/main'
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ steps.version.outputs.version }}
name: XtremMobile v${{ steps.version.outputs.version }}
files: xtremobile-v${{ steps.version.outputs.version }}-unsigned.ipa
generate_release_notes: true