Guide des problèmes d'autorisation de développement macOS
Comme le LCC Unity SDK utilise une bibliothèque de décodage webP tierce, vous pouvez rencontrer l'erreur « Failed to open xxx.bundle » lors de l'utilisation du SDK sur macOS. Il s'agit du mécanisme de sécurité de macOS (Gatekeeper) qui bloque l'exécution de plugins tiers non certifiés, et cela n'a rien à voir avec Unity ou le SDK lui-même.
Ce guide comporte deux parties :
- Partie 1 : Résoudre temporairement les problèmes d'autorisation des bibliothèques tierces dans l'environnement de développement.
- Partie 2 : La solution formelle lors du packageage d'une application (pour la distribution publique).
Partie 1 : Résoudre temporairement les problèmes d'autorisation des bibliothèques tierces dans l'environnement de développement
Les méthodes suivantes s'appliquent pour supprimer rapidement la restriction du bundle pendant le développement ; essayez-les par ordre de priorité.
Méthode 1 : Autoriser directement dans les réglages système (la plus rapide)
| Étape | Opération |
|---|---|
| 1 | Ouvrez les Réglages système du Mac, et trouvez Confidentialité et sécurité à gauche |
| 2 | Faites défiler vers le bas pour trouver la section « Sécurité » |
| 3 | Trouvez l'invite « xxx.bundle a été bloqué », et cliquez sur le bouton Autoriser adjacent |
| 4 | Redémarrez Unity, puis réimportez ou exécutez le SDK |
Méthode 2 : Supprimer l'attribut de quarantaine via le Terminal (la plus complète)
macOS ajoute l'attribut de quarantaine com.apple.quarantine aux fichiers téléchargés depuis le réseau ; vous pouvez le supprimer directement avec une commande du Terminal.
| Étape | Opération |
|---|---|
| 1 | Ouvrez Launchpad → Autres → Terminal |
| 2 | Saisissez la commande (gardez un espace final) : sudo xattr -rd com.apple.quarantine |
| 3 | Faites glisser le fichier xxx.bundle qui a signalé l'erreur directement dans la fenêtre du Terminal pour compléter automatiquement le chemin |
| 4 | Appuyez sur Entrée, et saisissez le mot de passe de connexion du Mac (non affiché pendant la frappe, ce qui est normal) |
| 5 | Redémarrez Unity après la fin de la commande |
Conseil :
Cette commande nécessite des privilèges administrateur (
sudo). L'écran n'affichera rien pendant que vous tapez le mot de passe ; terminez simplement de taper et appuyez sur Entrée.
Méthode 3 : Ajouter des autorisations d'exécution (complémentaire)
Si les méthodes 1 et 2 ne fonctionnent toujours pas, ajoutez des autorisations d'exécution au bundle :
chmod -R 755 /path/to/xxx.bundle
Vous pouvez également faire glisser le fichier bundle dans le Terminal pour compléter automatiquement le chemin, appuyer sur Entrée et redémarrer Unity.
Méthode 4 : Vérifier les paramètres de plateforme du plugin Unity
| Étape | Opération |
|---|---|
| 1 | Trouvez le fichier xxx.bundle dans la fenêtre Projet de Unity |
| 2 | Sélectionnez-le et regardez la fenêtre Inspecteur |
| 3 | Dans Platform Settings, cochez Any Platform, ou cochez séparément Standalone / macOS |
| 4 | Assurez-vous que Exclude Platform n'est pas coché |

Cocher Any Platform ou macOS dans Platform Settings dans l'Inspecteur
Méthode 5 : Désactiver temporairement Gatekeeper (dernier recours)
Avertissement :
Cette méthode réduit la sécurité du système. Elle n'est recommandée que pour une utilisation temporaire sur une machine de développement ; assurez-vous de le réactiver une fois le développement terminé.
Si aucune des méthodes ci-dessus ne fonctionne, vous pouvez désactiver temporairement la vérification de sécurité du système :
sudo spctl --master-disable
Vérifiez s'il est désactivé :
spctl --status
# assessments disabled s'affiche lorsqu'il est désactivé avec succès
Réactivez la protection de sécurité une fois le développement terminé :
sudo spctl --master-enable
Partie 2 : Résoudre les problèmes d'autorisation des bibliothèques tierces lors du packageage d'une application
Pour permettre aux utilisateurs finaux d'utiliser une application contenant un SDK tiers sans percevoir le problème, vous devez effectuer « signature profonde du code + notarisation Apple + liaison du ticket Staple » côté développeur. C'est la seule solution standard conforme sur macOS avec zéro opération utilisateur.
Prérequis (tous requis)
| N° | Condition | Description |
|---|---|---|
| 1 | Apple Developer Program | 99 USD/an, utilisé pour obtenir le certificat Developer ID Application |
| 2 | Activer Hardened Runtime | Dans Unity Player Settings → Other Settings → Mac, cochez Use Hardened Runtime |
| 3 | Configurer un Bundle ID unique | Gardez-le cohérent avec le portail développeur |
| 4 | Désactiver la signature automatique Unity | Utilisez le Terminal pour signer manuellement en profondeur après le packageage |
Flux de travail complet de signature et de notarisation
Étape 1 : Effacer les attributs étendus
xattr -cr "YourApp.app"
Étape 2 : Signature récursive profonde
Le paramètre --deep parcourt automatiquement tous les fichiers internes .bundle, .dylib et .framework et les signe uniformément, résolvant complètement le problème des bundles tiers bloqués pour être non signés.
codesign --force --deep --options runtime --sign "Developer ID Application: YourCompany (TeamID)" "YourApp.app"
Point clé :
Remplacez
YourCompany (TeamID)par votre Developer ID complet. L'utilisation de--deepgarantit que tous les bundles tiers internes sont signés — c'est la cause racine de 90 % des problèmes « erreurs toujours après signature ».
Étape 3 : Packager un zip standard pour la notarisation
Vous devez utiliser la commande ditto pour packager ; n'utilisez pas la compression par clic droit du système (sinon la vérification de notarisation échouera).
ditto -c -k --sequesterRsrc --keepParent "YourApp.app" build.zip
Étape 4 : Téléverser vers Apple pour la notarisation
Utilisez notarytool (le nouvel outil officiel) pour soumettre à la notarisation ; le backend d'Apple analyse automatiquement le code malveillant :
xcrun notarytool submit build.zip --apple-id your@apple.com --password app-specific-password --team-id TeamID --wait
Attendez que Accepted soit retourné, ce qui signifie que la notarisation a réussi.
Étape 5 : Agrafer le ticket de notarisation dans l'App
Après l'agrafage, les utilisateurs peuvent passer la vérification même en s'ouvrant hors ligne :
xcrun stapler staple "YourApp.app"
# Vérifier s'il a réussi
xcrun stapler validate "YourApp.app"
Tests internes / distribution intranet d'entreprise (alternative)
Si vous n'avez pas encore de compte développeur Apple, vous pouvez distribuer au sein de l'intranet en utilisant l'approche suivante :
| Étape | Opération |
|---|---|
| 1 | Unity package le .app |
| 2 | Sur la machine de build, exécutez : xattr -rd com.apple.quarantine "YourApp.app" |
| 3 | Distribuez via des outils intranet (scp, cloud d'entreprise, clé USB), ne téléchargez pas via un navigateur |
Limitation :
Cette approche ne s'applique qu'au transfert intranet. Les téléchargements par navigateur ajouteront à nouveau l'attribut de quarantaine, provoquant la réapparition de l'erreur de bundle, et n'est pas adaptée à la distribution publique.
Pièges courants
| Erreur courante | Approche correcte |
|---|---|
A signé uniquement le programme principal, sans --deep | Doit utiliser --deep pour signer récursivement tous les bundles / dylibs internes |
| N'a pas activé Hardened Runtime | Cochez-le dans Player Settings avant le packageage Unity, sinon la notarisation échoue directement |
| A oublié d'agrafer le ticket après la notarisation | Doit exécuter xcrun stapler staple, sinon l'ouverture hors ligne affiche toujours la boîte de dialogue |
| N'a pas effacé les attributs étendus avant la signature | Exécutez d'abord xattr -cr pour effacer les attributs résiduels de tous les bundles, puis signez |
A utilisé la compression par clic droit du système au lieu de ditto | Doit utiliser le packageage standard ditto -c -k, sinon la vérification de notarisation échoue |
Résumé
La seule solution standard pour la distribution publique = Apple Developer ID + codesign profond + notarisation notarytool + ticket stapler. Une fois terminé, les utilisateurs téléchargent et utilisent immédiatement, sans boîte de dialogue de sécurité et sans perception du problème.