Contrainte posée aujourd'hui : coach → la montre, sans TrainingPeaks, sans Polar Flow, sans Intervals.icu. Toutes les autres voies passent par un tiers ; celle-ci est la seule qui reste, et elle était déjà prouvée en USB le 17/08. Manquait le transport qui la rende utilisable — brancher la montre au Mac cinq minutes avant de sortir n'est pas un usage. `CoachPolarBLE` ne fait que transporter. Les octets viennent du serveur (GET /api/plan/polar-target), produits par un encodeur verrouillé octet pour octet contre des fichiers relus sur la montre. Rien n'est réencodé ici : le faire perdrait la seule garantie que le firmware acceptera le fichier. La chaîne SDK a été vérifiée sur les sources avant d'écrire une ligne, et elle est entièrement publique — CBDeviceListenerImpl, search, openSessionDirect, fetchGattClient(PSFTP_SERVICE), waitPsFtpReady, write(header:data:). Ni fork, ni symbole interne. Le morceau qui compte vraiment est ailleurs. `PolarPftpStep` est séparé du plugin et n'importe que Foundation, pour être exécuté sur Linux : il porte l'en-tête PbPFtpOperation et les deux règles qui décident si une requête part. Le 17/08, un PUT de 174 octets vers un chemin terminé par « / » a bloqué la montre — écran noir, appui long sur OK pour la récupérer. Le firmware ne refuse pas, il s'effondre, et le Bluetooth utilise le même protocole. Ces règles ne peuvent donc pas être vérifiées « à la relecture » : 12 tests les exécutent, dont celui qui interdit de reporter ici le cadrage série [0x05, taille, taille] de la version USB — en BLE c'est le SDK qui cadre, l'ajouter produirait précisément une requête malformée. L'en-tête produit par Swift a été comparé à celui de polar_ftp.py sur trois chemins, dont un de 205 caractères pour le varint sur deux octets : mêmes octets. 69 tests au vert sur tests-linux. Un mode dryRun construit et décrit chaque requête sans rien émettre — le --dry-run qui manquait le jour du plantage. Le runbook Mac dit de s'en servir au premier essai, et liste les trois inconnues qui ne se lèveront que montre en main, la première étant : la V3 accepte-t-elle une connexion BLE tierce pendant qu'elle est appairée à Flow ? Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
89 lines
3.9 KiB
Plaintext
89 lines
3.9 KiB
Plaintext
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>CAPACITOR_DEBUG</key>
|
|
<string>$(CAPACITOR_DEBUG)</string>
|
|
<key>CFBundleDevelopmentRegion</key>
|
|
<string>en</string>
|
|
<key>CFBundleDisplayName</key>
|
|
<string>Coach Hypnotruck</string>
|
|
<key>CFBundleExecutable</key>
|
|
<string>$(EXECUTABLE_NAME)</string>
|
|
<key>CFBundleIdentifier</key>
|
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
<key>CFBundleInfoDictionaryVersion</key>
|
|
<string>6.0</string>
|
|
<key>CFBundleName</key>
|
|
<string>$(PRODUCT_NAME)</string>
|
|
<key>CFBundlePackageType</key>
|
|
<string>APPL</string>
|
|
<key>CFBundleShortVersionString</key>
|
|
<string>$(MARKETING_VERSION)</string>
|
|
<key>CFBundleVersion</key>
|
|
<string>$(CURRENT_PROJECT_VERSION)</string>
|
|
<key>ITSAppUsesNonExemptEncryption</key>
|
|
<false/>
|
|
<key>LSRequiresIPhoneOS</key>
|
|
<true/>
|
|
<key>NSBluetoothAlwaysUsageDescription</key>
|
|
<string>Coach Hypnotruck se connecte en Bluetooth à votre montre Polar pour y déposer la séance du jour, avec ses phases et ses zones cardiaques. La connexion ne sert qu'à cet envoi et aucune donnée n'est lue sur la montre.</string>
|
|
<key>NSCameraUsageDescription</key>
|
|
<string>Coach Hypnotruck utilise l'appareil photo pour scanner les codes-barres des aliments, photographier vos assiettes et photographier les étiquettes nutritionnelles. Ces images servent à identifier l'aliment et à estimer ses valeurs nutritionnelles, puis à alimenter votre journal alimentaire.</string>
|
|
<key>NSHealthShareUsageDescription</key>
|
|
<string>Coach Hypnotruck lit vos données de santé (FC, pas, calories, VO2max) pour adapter vos séances et tracker votre progression.</string>
|
|
<key>NSHealthUpdateUsageDescription</key>
|
|
<string>Coach Hypnotruck enregistre vos séances dans Santé pour centraliser votre suivi sportif.</string>
|
|
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
|
|
<string>Permet le suivi GPS pendant les sorties même quand l'app est en arrière-plan.</string>
|
|
<key>NSLocationWhenInUseUsageDescription</key>
|
|
<string>Coach Hypnotruck utilise votre position pour tracer vos sorties course et VTT.</string>
|
|
<key>NSMotionUsageDescription</key>
|
|
<string>Coach Hypnotruck utilise les capteurs de mouvement pour mesurer votre activité.</string>
|
|
<key>NSSupportsLiveActivities</key>
|
|
<true/>
|
|
<key>NSPhotoLibraryUsageDescription</key>
|
|
<string>Coach Hypnotruck accède à vos photos pour importer une image déjà prise : photo d'assiette ou d'étiquette nutritionnelle à analyser, photo de séance, ou photo de profil. Seules les images que vous choisissez sont envoyées, pour alimenter votre journal alimentaire et votre compte.</string>
|
|
<key>UIBackgroundModes</key>
|
|
<array>
|
|
<string>remote-notification</string>
|
|
<string>location</string>
|
|
<string>fetch</string>
|
|
</array>
|
|
<key>UILaunchStoryboardName</key>
|
|
<string>LaunchScreen</string>
|
|
<key>UIMainStoryboardFile</key>
|
|
<string>Main</string>
|
|
<key>UIRequiredDeviceCapabilities</key>
|
|
<array>
|
|
<string>armv7</string>
|
|
</array>
|
|
<key>UISupportedInterfaceOrientations</key>
|
|
<array>
|
|
<string>UIInterfaceOrientationPortrait</string>
|
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
</array>
|
|
<key>UISupportedInterfaceOrientations~ipad</key>
|
|
<array>
|
|
<string>UIInterfaceOrientationPortrait</string>
|
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
</array>
|
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
|
<true/>
|
|
<key>GIDClientID</key>
|
|
<string>817483900105-amoanmsold3j3k71retpjuhvrknsuunh.apps.googleusercontent.com</string>
|
|
<key>CFBundleURLTypes</key>
|
|
<array>
|
|
<dict>
|
|
<key>CFBundleURLSchemes</key>
|
|
<array>
|
|
<string>com.googleusercontent.apps.817483900105-amoanmsold3j3k71retpjuhvrknsuunh</string>
|
|
</array>
|
|
</dict>
|
|
</array>
|
|
</dict>
|
|
</plist>
|