Files
coach-ios/README.md
Sylvain Bettinelli 3e71dbe3a3 Auto-login via token coach_web_token au lancement
- capacitor.config.ts charge coachWebToken depuis coach-ios.local.json (gitignored)
- server.url devient https://coach.hypnotruck.ch/login?token=... → backend pose le cookie 1 an, redirige vers /
- Au prochain lancement, le cookie tient → /login?token redirige direct vers /
- coach-ios.local.json.example fourni pour setup Mac mini
2026-05-05 19:15:59 +00:00

167 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Coach Hypnotruck — iOS
Wrapper natif iOS de [coach.hypnotruck.ch](https://coach.hypnotruck.ch) basé sur Capacitor 8.
## Architecture
- **Backend** : FastAPI + Jinja2 hébergé sur le VPS, accessible via `https://coach.hypnotruck.ch`
- **Coque iOS** : Capacitor 8 charge l'URL distante dans un WKWebView
- **Plugins natifs** : push notifications, local notifications, géolocalisation, HealthKit (Capgo), splash, status bar, haptics
Le code web n'est pas embarqué — l'app pointe vers la prod via `server.url` dans `capacitor.config.ts`. Avantage : déploiement web = mise à jour instantanée de l'app sans review Apple.
## Bundle ID & nom
- **Bundle ID** : `ch.hypnotruck.coach`
- **App Store name** : `Coach Hypnotruck`
- **Display name** : `Coach Hypnotruck`
## Prérequis (sur le Mac mini)
- macOS 13+ (Ventura ou plus récent)
- Xcode 15+ (App Store, ~10 Go)
- Command Line Tools : `xcode-select --install`
- Homebrew + `brew install node cocoapods`
- Node 20 LTS (compatible avec Cap 8)
- Compte Apple Developer Program actif (99 USD/an)
- Apple ID `dev@hypnotruck.ch` connecté dans Xcode → Settings → Accounts
## Workflow build
### 1. Cloner le repo sur le Mac mini
```bash
git clone https://git.nexus.hypnotruck.ch/sylvain/coach-ios.git
cd coach-ios
npm install
```
### 1bis. Configurer le token d'auth (auto-login)
Le repo ne contient **pas** le token `COACH_WEB_TOKEN` (gitignored). Crée le fichier sur le Mac :
```bash
cp coach-ios.local.json.example coach-ios.local.json
# Édite coach-ios.local.json et remplace par la vraie valeur
# (visible dans ~/.config/infomaniak.env sur le VPS, ligne export COACH_WEB_TOKEN=)
```
L'app utilisera ce token pour se connecter automatiquement à `coach.hypnotruck.ch/login?token=...` au lancement.
### 2. Générer les icônes & splash
```bash
npx @capacitor/assets generate --ios
```
Génère toutes les tailles requises depuis `resources/icon.png` (1024×1024) et `resources/splash.png` (2732×2732).
### 3. Ajouter la plateforme iOS (à faire UNE SEULE FOIS sur le Mac)
```bash
npx cap add ios
```
Cette commande crée le dossier `ios/` avec le projet Xcode, qui sera ensuite committé.
### 4. Sync (à chaque changement de plugins ou config)
```bash
npx cap sync ios
```
### 5. Ouvrir dans Xcode
```bash
npx cap open ios
```
Dans Xcode :
1. Sélectionner le projet **App** dans la navigation gauche
2. Onglet **Signing & Capabilities** :
- Team : ton équipe Apple Developer
- Bundle Identifier : `ch.hypnotruck.coach`
- Cocher "Automatically manage signing"
3. Ajouter les capabilities requises :
- **HealthKit** (lecture FC, pas, calories, VO2max)
- **Push Notifications**
- **Background Modes** → Remote notifications
4. Onglet **Info** : ajouter les clés Privacy obligatoires (voir section ci-dessous)
### 6. Build sur simulateur / device
- Simulateur : choisir un iPhone dans la barre du haut → ⌘R
- Device physique : connecter iPhone par USB, sélectionner, ⌘R (la 1ère fois iOS demande de faire confiance au certificat dev dans Réglages → Général → VPN et gestion des appareils)
### 7. Upload TestFlight
1. Xcode → Product → **Archive**
2. Fenêtre Organizer s'ouvre → sélectionner l'archive → **Distribute App****App Store Connect****Upload**
3. Sur [App Store Connect](https://appstoreconnect.apple.com) : créer une nouvelle app (1ère fois), section **TestFlight** → ajouter testeurs (jusqu'à 100 internes sans review, 10 000 externes avec review légère)
## Privacy keys requises (Info.plist)
Sans ces clés, iOS crashe à l'usage du plugin. À ajouter dans Xcode → onglet Info → Custom iOS Target Properties :
| Clé | Valeur (description affichée à l'utilisateur) |
|---|---|
| `NSHealthShareUsageDescription` | "Coach Hypnotruck lit vos données de santé (FC, pas, calories) pour adapter vos séances." |
| `NSHealthUpdateUsageDescription` | "Coach Hypnotruck enregistre vos séances dans Santé pour suivre votre progression." |
| `NSLocationWhenInUseUsageDescription` | "Coach Hypnotruck utilise votre position pour tracer vos sorties course et VTT." |
| `NSLocationAlwaysAndWhenInUseUsageDescription` | "Permet le suivi GPS pendant les sorties même app en arrière-plan." |
| `NSMotionUsageDescription` | "Coach Hypnotruck utilise les capteurs de mouvement pour mesurer votre activité." |
| `NSCameraUsageDescription` | "Coach Hypnotruck peut utiliser l'appareil photo pour scanner des codes-barres alimentaires." |
## Anti-rejet App Store (Guideline 4.2)
Apple rejette les apps qui sont juste un wrapper webview sans valeur native. Pour passer review :
-**Push notifications natives** (rappel séances) — implémenté côté iOS via `@capacitor/push-notifications`
-**HealthKit** (lecture FC, pas, calories) — implémenté via `@capgo/capacitor-health`
-**Géolocalisation** native pour tracking sorties
-**Local notifications** (rappels hors-ligne)
-**Haptics** sur actions importantes
- ⏳ À implémenter côté web : appeler ces plugins via JS bridge depuis coach.hypnotruck.ch
## Structure repo
```
coach-ios/
├── capacitor.config.ts # Config Capacitor (bundle ID, URL, plugins)
├── package.json # Deps Capacitor + plugins
├── www/ # Page de bootstrap (chargement, fallback)
│ └── index.html
├── resources/ # Source icônes & splash (1024×1024, 2732×2732)
│ ├── icon.png
│ └── splash.png
├── ios/ # Projet Xcode (généré par `cap add ios` sur Mac)
└── README.md
```
## Mise à jour de l'app
| Type de modif | Action requise |
|---|---|
| Changement web (templates, CSS, routes) | **Aucune** — l'app charge la prod en direct |
| Ajout plugin Capacitor | `npm install` + `npx cap sync ios` + nouveau build TestFlight |
| Changement icône / splash | `npx @capacitor/assets generate --ios` + sync + nouveau build |
| Changement bundle ID, version, capabilities | Build + soumission Apple review |
## TODO Phase 0
- [ ] Sur le Mac : `npx cap add ios` et commit du dossier `ios/`
- [ ] Configurer signing dans Xcode avec Apple ID `dev@hypnotruck.ch`
- [ ] Ajouter les Privacy keys dans Info.plist
- [ ] 1er build simulateur pour vérifier que la PWA charge bien
- [ ] 1er build device physique (iPhone perso)
- [ ] Upload TestFlight pour beta interne
- [ ] Préparer screenshots App Store (6.7" iPhone, min 3)
- [ ] Privacy policy URL (obligatoire avec HealthKit) — à héberger sur coach.hypnotruck.ch/privacy
## Support
- [Doc Capacitor](https://capacitorjs.com/docs)
- [Capgo Health plugin](https://github.com/Cap-go/capacitor-health)
- [Apple Developer](https://developer.apple.com/account)