Après la mise à niveau vers Xcode 11.2 à partir de Xcode 11.1, l'application se bloque en raison de _UITextLayoutView


351

Après la mise à niveau vers Xcode 11.2 à partir de Xcode 11.1, mon application se bloque:

*** Arrêt de l'application en raison d'une exception non interceptée 'NSInvalidUnarchiveOperationException', raison: 'Impossible d'instancier la classe nommée _UITextLayoutView car aucune classe nommée _UITextLayoutView n'a été trouvée; la classe doit être définie dans le code source ou liée à partir d'une bibliothèque (assurez-vous que la classe fait partie de la bonne cible) '

Pourquoi cela arrive-t-il? Comment puis-je éviter ce plantage?


17
On dirait le bogue Xcode 11.2. Consultez le fil forums.developer.apple.com/thread/125287 . Très probablement, il est lié aux TextViews dans la hiérarchie
Pavel Stepanov

3
@DanielStorm malheureusement, cela n'a pas aidé. Je viens d'ajouter un simple UITextView à un écran qui ne l'avait pas auparavant (et ne s'est pas écrasé auparavant aussi :)). Maintenant, il se bloque avec la même erreur. Le problème persiste pour tous les appareils / simulateurs, à l'exception du dernier iOS 13.2
Pavel Stepanov,

3
Est-ce que quelqu'un sait si cela va planter les applications de production construites avec Xcode 11.2 lors de l'exécution sur des appareils iOS 13.1.2?
gfpacheco

2
c'est une très bonne question, d'où les 198 votes, donc je ne sais vraiment pas pourquoi quelqu'un l'a marqué comme "mis en attente pas clair"
Mike Volmar

4
@MikeVolmar J'ai voté pour fermer et n'est plus pertinent. Il est corrigé avec 11.2.1. Cette question avait une fenêtre d’utilité très courte.
rmaddy

Réponses:


145

Félicitations

La nouvelle version de Xcode (11.2.1) est disponible maintenant, ce qui est le meilleur moyen de se débarrasser de ce problème.

Solutions de contournement

@Mojtaba Hosseini la solution que j'ai proposée était de l'aide et de la participation de mon côté à mes collègues développeurs via StackOverflow. Vous, moi et tout le reste du développeur ici savons déjà que lorsque la nouvelle version sera annoncée par Apple, ce problème aura disparu.

Mais à côté de tout

La solution susmentionnée a été définitivement acceptée par Apple Review car aucune API privée n'est impliquée. Cette approche est très similaire à la création de propriété comme

@interface UITextView (Layout)

Ou

UITextView + Layout.h

Ainsi, lorsque vous créez une propriété, vous utilisez directement les composants privés APPLE et les modifiez à nouveau selon vos besoins ou vos exigences.

L'exemple simple est les classes AMFNetworking

- (void)setImageWithURL:(NSURL *)url {
    [self setImageWithURL:url placeholderImage:nil];
}

J'espère que j'en ai fini avec l'allégation

La réponse ci-dessous était juste une aide de mon côté pour permettre au développeur de continuer à développer comme vous, nous avons initialement proposé au développeur de restaurer Xcode. Ce fut une mauvaise pratique de télécharger à nouveau 8 Go de Xcode car nous savons tous que la nouvelle version de Xcode sera bientôt disponible.

Bien qu'il soit corrigé dans Xcode 11.2.1, j'ai une solution pour Xcode 11.2 par laquelle vous pouvez vous débarrasser de ce plantage:

*** Arrêt de l'application en raison d'une exception non interceptée 'NSInvalidUnarchiveOperationException', raison: 'Impossible d'instancier la classe nommée _UITextLayoutView car aucune classe nommée _UITextLayoutView n'a été trouvée; la classe doit être définie dans le code source ou liée à partir d'une bibliothèque (assurez-vous que la classe fait partie de la bonne cible) '

SOLUTION

Accédez à la recherche de paramètres de construction pour "DEAD_CODE_STRIPPING" et définissez-le sur NO.

DEAD_CODE_STRIPPING = NO

alors

créer des fichiers UITextViewWorkaround

UITextViewWorkaround.h

    #import <Foundation/Foundation.h>


    @interface UITextViewWorkaround : NSObject
    + (void)executeWorkaround; 
@end

UITextViewWorkaround.m

#import "UITextViewWorkaround.h"
#import  <objc/runtime.h>



    @implementation UITextViewWorkaround

    + (void)executeWorkaround {
        if (@available(iOS 13.2, *)) {
        }
        else {
            const char *className = "_UITextLayoutView";
            Class cls = objc_getClass(className);
            if (cls == nil) {
                cls = objc_allocateClassPair([UIView class], className, 0);
                objc_registerClassPair(cls);
    #if DEBUG
                printf("added %s dynamically\n", className);
    #endif
            }
        }
    }

    @end

l'exécuter dans le délégué de l'application

#import "UITextViewWorkaround.h"

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
            // Override point for customization after application launch.

            [UITextViewWorkaround executeWorkaround];
    return yes;
    }

Compilez le code et vous aurez une application en cours d'exécution :)


2
Si cela fonctionne pour vous, veuillez classer les autres afin qu'ils puissent également essayer cette solution
aftab muhammed khan

3
@Hardy_Germany J'ai testé cela un peu, pour Swift vous pouvez essayer: class UITextViewWorkaround: NSObject {class func executeWorkaround () {if #available (iOS 13.2, *) {} else {let className = "_UITextLayoutView" var cls = objc_getClass (className ) if cls == nil {cls = objc_allocateClassPair (UIView.self, className, 0) objc_registerClassPair (cls as! AnyClass) #if DEBUG print ("ajouté% @ dynamiquement \ n", className); #endif}}}}
John Nimis

2
@DaveDude DEAD_CODE_STRIPPING = NO est nécessaire si vous utilisez Swift Package Manager avec Xcode 11.2
Cœur

5
@pradipsutariya yes off-course pourquoi pas on ne change jamais rien dans APPLE CLASSES.
aftab muhammed khan

5
Seule la semence GM Xcode 11.2.1 (bêta) est publiée. La version stable pourrait sortir bientôt.
Lal Krishna

221

Mise à jour: corrigé! 🎉🎊

La SEULE solution consiste à mettre à jour

Ce bogue est corrigé dans Xcode 11.2.1. Vous pouvez donc le télécharger et l'utiliser à partir d'ici.

Les storyboards contenant un UITextView ne provoqueront plus le blocage de l'application sur les versions du système d'exploitation antérieures à iOS 13.2, tvOS 13.2 ou macOS 10.15.2. (56808566, 56873523)


Xcode 11.2 est déconseillé par Apple le 5 novembre 2019

si vous essayez de soumettre votre application qui construit avec Xcode 11.2 à l'AppStore, vous serez rejeté:

Avertissement de fonctionnement de l'App Store Connect

AVERTISSEMENT ITMS-90703 : "Build Xcode obsolète. En raison de problèmes d'archives d'application résolus, nous avons obsolète Xcode 11.2 le 5 novembre 2019. Téléchargez Xcode 11.2.1 ou une version plus récente, reconstruisez votre application et soumettez à nouveau."

Donc, toutes les solutions de contournement effectuées avec le Xcode 11.2 sont inutiles


C'est un bogue pour Xcode 11.2, et corrigé dans Xcode 11.2.1.

Solutions)

Faire reculer le précédent à Xcode version la version de: Rollback est plus une option et AppleStore rejettera toute construction avec Xcode ci - dessous 11.2.1 un coup d' oeil à ce

https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_11.1/Xcode_11.1.xip

Notez que vous devez utiliser Safari pour le télécharger et vous devez d'abord vous connecter au portail des développeurs Apple .

Vous pouvez trouver toutes les autres versions de Xcode et d'autres liens de ressources (y compris les versions de version et bêta) ici à https://developer.apple.com/download/more

La solution

C'est une solution de contournement très difficile mais qui fonctionne. Remplacez tous les UITextViews dans le storyboard s et Xib s par la version de code pur .


Notez que ce bug est trouvé et corrigé par Apple

Fixé

Plus tôt également, le bug a été confirmé par Apple Staff edford

Confirmation


Pour ceux avec iOS 13.2 et ne pouvant plus utiliser Xcode 11.1:

  1. Mettre à jour macOS vers 10.15.1 ou version ultérieure
  2. Installez Xcode 11.2.1 ou une version ultérieure
  3. Cela devrait fonctionner maintenant sur l'appareil mis à jour.

Pour ceux qui ont un storyboard:

  1. Sous-classe UITextView
  2. Assignez-le à tous les UITextViewobjets
  3. N'oubliez pas de mettre à jour les modifications de propriété susceptibles de perdre dans le sous-classement.

Pour ceux qui sont à l'aise avec la méthode swizzling (Objc et comportement dynamique)

Dirigez-vous vers la réponse @aftab muhammed khan pour Objective-C et @MikRo pour la version adaptée de Swift

Ne le faites plus:

Même si ces deux dernières solutions de contournement n'utilisent pas l'API privée d'Apple , elles seront rejetées dans l'AppStore car Apple n'acceptera pas les versions avec les versions Xcode sous 11.2.1 !

Et encore une fois:

Xcode 11.2 est déconseillé par Apple le 5 novembre 2019


3
Triste, mais la solution fonctionne pour moi. Merci! 11.1 fonctionne. Je ne suggérerais pas de convertir en code pur, car je parie qu'un correctif sera bientôt disponible. Si cela ne vous dérange pas: mettez à jour cette réponse une fois qu'une nouvelle version fonctionne. Ce serait mauvais si les gens commençaient à télécharger l'événement 11.1 bien qu'il existe une version fixe :)
Sebastian Weiß

2
J'ai déjà 11.1 mais je n'ai pas fonctionné, je n'ai pas mis à niveau vers 11.2.
JAHelia

6
Veuillez noter que vous devriez probablement supprimer l'application de votre périphérique de développement et / ou nettoyer le dossier de construction de Xcode ( CMD + Shift + K)
JeroenJK

3
Comment puis-je passer à la version 11.2.1? Il n'apparaît pas sur l'App Store. Et le téléchargement de la graine GM à partir du portail des développeurs tente de télécharger l'application partout pour environ 8 Go!
mesqueeb

3
De plus, s'il est obsolète, pourquoi Apple ne supprime-t-il pas simplement 11.2 dans l'App Store pour l'instant?
Malcolm Salvador

40

Le problème a été résolu dans Xcode 11.2.1.

EDIT: comme le correctif est maintenant publié, vous devez passer à cette version Xcode et commenter cette solution de contournement. Comme l'a mentionné Mojtaba Hosseini dans sa réponse:

... ces deux dernières solutions de contournement utilisent l'API privée d'Apple et seront rejetées par Apple!

Pour le temps jusqu'à ce que le correctif soit publié par Apple, c'était une bonne solution de contournement pour continuer à développer et à tester.


Pour Xcode 11.2, basé sur l'idée d'Aftab Muhammed Khan et avec l'aide de John Nimis, je viens de tester le code suivant.

Aucun changement dans les fichiers du storyboard nécessaire!

Modifié mon fichier AppDelegate.swift et ajouté cette classe

//******************************************************************
// MARK: - Workaround for the Xcode 11.2 bug
//******************************************************************
class UITextViewWorkaround: NSObject {

    // --------------------------------------------------------------------
    // MARK: Singleton
    // --------------------------------------------------------------------
    // make it a singleton
    static let unique = UITextViewWorkaround()

    // --------------------------------------------------------------------
    // MARK: executeWorkaround()
    // --------------------------------------------------------------------
    func executeWorkaround() {

        if #available(iOS 13.2, *) {

            NSLog("UITextViewWorkaround.unique.executeWorkaround(): we are on iOS 13.2+ no need for a workaround")

        } else {

            // name of the missing class stub
            let className = "_UITextLayoutView"

            // try to get the class
            var cls = objc_getClass(className)

            // check if class is available
            if cls == nil {

                // it's not available, so create a replacement and register it
                cls = objc_allocateClassPair(UIView.self, className, 0)
                objc_registerClassPair(cls as! AnyClass)

                #if DEBUG
                NSLog("UITextViewWorkaround.unique.executeWorkaround(): added \(className) dynamically")
               #endif
           }
        }
    }
}

et dans l'appel délégué pour "didFinishLaunchingWithOptions" appeler la solution de contournement

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Override point for customization after application launch.

    // This is the workaround for Xcode 11.2
    UITextViewWorkaround.unique.executeWorkaround()
}

34

J'ai adapté la solution Obj-C de khan à Swift :

import UIKit

@objc
class UITextViewWorkaround : NSObject {

    static func executeWorkaround() {
        if #available(iOS 13.2, *) {
        } else {
            let className = "_UITextLayoutView"
            let theClass = objc_getClass(className)
            if theClass == nil {
                let classPair: AnyClass? = objc_allocateClassPair(UIView.self, className, 0)
                objc_registerClassPair(classPair!)
            }
        }
    }

}

Appelez à la fin de didFinishLaunchingWithOptionsdans AppDelegate.

Merci @Aftab!


où nous devons ajouter ce code? Dans les fichiers des délégués?
SIDHARTH PU

@SIDHARTHPU vous pouvez l'appelerdidFinishLaunchingWithOptions
Lal Krishna

essayé une variété de correctifs sur ce problème et celui-ci a fait l'affaire jusqu'à Xcode 11.3?! THX!
FlimFlam Vir

1
C'est la solution la plus courte et la plus brillante!
sVd

1
@LalKrishna Créez un nouveau fichier nommé UITextViewWorkaround.swift et ajoutez-y le code ci-dessus. Ajoutez ensuite UITextViewWorkaround.executeWorkaround () à didFinishLaunchingWithOptions avant l'instruction return.
ashishn

22

Une solution plus rapide:

///Substitute class for _UITextLayoutView bug
class FixedTextView: UITextView {
    required init?(coder: NSCoder) {
        if #available(iOS 13.2, *) {
            super.init(coder: coder)
        }
        else {
            let rect = CGRect(origin: .zero, size: CGSize(width: 100, height: 44*3))
            super.init(frame: rect, textContainer: nil)
        }
    }
}

Ajoutez ce code quelque part, puis remplacez toutes les instances de storyboard dans FixedTextView.

Remarque: vous perdrez tous les attributs créés dans les storyboards. Cela pourrait avoir de sérieuses implications (par exemple, configuration des délégués, taille, etc.)


Cela semble être une bonne étape vers une solution de contournement, mais pas encore une solution ...
Fattie

18

Solution mise à jour : mise à jour vers Xcode 11.2.1 . Cela fonctionne sur les appareils iOS 11, 12 ou 13 pour moi.

Reportez-vous à la documentation d' Apple. Cette mise à jour corrige un problème critique pouvant entraîner le blocage des applications utilisant UITextView.

Ancienne solution: Xcode 11.1 téléchargé sur https://developer.apple.com/download/more/ Le retour de 11.2 à 11.1 a corrigé le plantage.

De plus, pour moi, même avec Xcode 11.2, lorsque j'ai mis à niveau mon iPhone vers 13.2, cela a corrigé le plantage.


2
C'est la solution la plus simple
mettez à

6
La mise à niveau d'iOS n'est clairement pas un correctif étant donné que OP parle dans une perspective de développeur.
keeshux

2
Apple a confirmé que le bogue se produit avec les versions iOS antérieures à 13.2 et Xcode 11.2.
Chuck Krutsinger

XCode rétrogradé à la version 11.1 (11A1027) - ont toujours le même plantage (
rommex

si vous mettez à niveau ou rétrogradez et que le dossier de construction de Xcode (CMD + Shift + K) se bloque toujours selon le commentaire de Wojteck ci-dessous, ce qui m'a corrigé lors de la mise à niveau
Mike Volmar

17

11.2.1 Les semences GM résolvent ce problème

(et il peut être utilisé pour publier sur l'App Store)

Accédez à https://developer.apple.com/download/ . Télécharger la graine Xcode 11.2.1 GM

Les notes de version confirment qu'il corrige cette erreur:

entrez la description de l'image ici


5
Veuillez noter qu'après avoir installé Xcode 11.2.1 GM seed, vous devez probablement supprimer l'application de votre périphérique de développement et / ou nettoyer le dossier de construction de Xcode (CMD + Shift + K).
Wojtek Dmyszewicz

13

Vous pouvez aller télécharger la dernière version bêta de Xcode (GM 11.2.1) sur le site Web des développeurs Apple.

Ici le lien direct

Graine Xcode 11.2.1 GM


Veuillez noter qu'après avoir installé Xcode 11.2.1 GM seed, vous devez probablement supprimer l'application de votre périphérique de développement et / ou nettoyer le dossier de construction de Xcode (CMD + Shift + K).
Wojtek Dmyszewicz

installé et exécuté sans aucune autre procédure. Problème résolu Boss
BossOz

comment installer cela? Il m'a donné un dossier, mais il n'y a pas d'exécutable
Scobee

1
il suffit de télécharger zip à partir du lien fourni et de l'extraire. Copiez ensuite l'application dans le dossier Application.
BossOz

1
le problème est que lorsque je l'extrait, j'obtiens deux fichiers, Contenu et Métadonnées ... c'est pourquoi j'ai demandé quoi faire avec eux. J'ai utilisé un utilitaire d'archivage parce que cliquer dessus échouait normalement. Je vais réessayer
Scobee

12

Amélioration de la réponse @garafajon. Pour moi, cela fonctionne dans la plupart des cas.

///Substitute class for _UITextLayoutView bug
class FixedTextView: UITextView {
    required init?(coder: NSCoder) {
        if #available(iOS 13.2, *) {
            super.init(coder: coder)
        }
        else {
            super.init(frame: .zero, textContainer: nil)
            self.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            self.contentMode = .scaleToFill

            self.isScrollEnabled = false   // causes expanding height

            // Auto Layout
            self.translatesAutoresizingMaskIntoConstraints = false
            self.font = UIFont(name: "HelveticaNeue", size: 18)
        }
    }
}

1
Marche parfaitement. Le code de @ garafajon a causé des problèmes avec les boîtes dans des endroits inattendus. Cela résout ces problèmes ~ excellent travail!
ekrenzin

8

En tant que solution «rapide», vous pouvez ajouter le UITextViewdirectement à partir du code et non via IB. Au moins, cela a fonctionné pour moi. Bien que de mon point de vue, il est préférable de revenir au Xcode précédent / d'attendre le nouveau.


6

C'est un bug avec Xcode 11.2. Les vues de texte sous-classées se bloquent sur tous les appareils sur lesquels la nouvelle version iOS (13.2) n'est pas installée. Vous feriez probablement mieux de ne pas créer de version avec cette version.

Tu peux maintenant:

  • rétrograder Xcode vers 11.1 ou
  • mettre à niveau votre appareil vers iOS 13.2

1
Ce bug affecte-t-il uniquement les vues de texte sous-classées?
Darren

1
La mise à jour d'iOS lors de la mise à jour de Xcode résout le problème.
Buyin Brian

2
La question est de savoir si le crash se produira sur une application publiée avec chaque iOS inférieur à 13.2 ... J'ai peur d'essayer ...
mark.so.cgn

6

J'ai utilisé une solution de contournement réussie, mais c'était douloureux. Voici le processus que j'ai suivi:

  1. Ouvrez le XIB dans un éditeur de texte
  2. Trouvez le fautif TextView. Dans mon cas:
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="782-j1-88c" customClass="LCAnsiConsoleTextView">
  <rect key="frame" x="16" y="20" width="343" height="589"/>
  <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  <fontDescription key="fontDescription" name="Menlo-Regular" family="Menlo" pointSize="12"/>
  <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
  1. Notez son id(dans mon cas: id="782-j1-88c")
  2. Remplacez la classe comme indiqué dans les réponses ci-dessus et recréez les options (la mienne est Objective-C, désolé):
@implementation FixedTextView

- (id) initWithCoder:(NSCoder*)coder
{
    if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){13,2,0}])
        self = [super initWithCoder:coder];
    else {
        self = [super initWithFrame:CGRectMake(16, 3, 343, 605)];
        self.editable = YES;
        self.selectable = YES;
        self.insetsLayoutMarginsFromSafeArea = YES;
        self.clipsToBounds = YES;
        self.clearsContextBeforeDrawing = YES;
        self.autoresizesSubviews = YES;
        self.contentMode = UIViewContentModeScaleToFill;
        self.scrollEnabled = YES;
        self.userInteractionEnabled = YES;
        self.multipleTouchEnabled = YES;
        self.translatesAutoresizingMaskIntoConstraints = NO;
        self.font = [UIFont fontWithName:@"Menlo-Regular" size:12.0];
    }
    return self;
}
  1. Notez les contraintes qui incluent votre identifiant de vue texte et recréez ces contraintes par rapport aux autres identifiants d'élément dans votre vue ou votre contrôleur de vue. Dans mon cas:
- (id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self xibSetup];
        [self initView];
/*
        <constraint firstItem="75C-lt-YtE" firstAttribute="top" secondItem="782-j1-88c" secondAttribute="bottom" constant="8" symbolic="YES" id="8SH-5l-FAs"/>
        <constraint firstItem="782-j1-88c" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leadingMargin" id="Mve-aZ-HCe"/>
        <constraint firstItem="782-j1-88c" firstAttribute="leading" secondItem="75C-lt-YtE" secondAttribute="leading" id="dPG-u3-cCi"/>
        <constraint firstItem="782-j1-88c" firstAttribute="trailing" secondItem="iN0-l3-epB" secondAttribute="trailingMargin" id="sjT-0Q-hNj"/>
        <constraint firstItem="782-j1-88c" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" id="vic-vZ-osR"/>
*/
        [self.command.topAnchor constraintEqualToAnchor:self.console.bottomAnchor constant:8].active = YES;
        [self.console.leadingAnchor constraintEqualToAnchor:self.layoutMarginsGuide.leadingAnchor].active = YES;
        [self.console.leadingAnchor constraintEqualToAnchor:self.command.leadingAnchor].active = YES;
        [self.console.trailingAnchor constraintEqualToAnchor:self.trailingAnchor].active = YES;
        [self.console.topAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.topAnchor].active = YES;

    }
    return self;
}

Faire cela a résolu le problème pour moi sans perte de fonctionnalité souhaitée. Heureusement, je n'avais qu'un seul UITextViewà remplacer. Sinon, cela devient intenable.


2

J'ai eu le même problème que je viens de mettre à niveau mon Xcode 11.2 vers 11.2.1, cela a bien fonctionné.

Après la mise à niveau, j'ai testé le même sur iOs 13 et iOS 12 et cela fonctionnait bien.


Duplicata de la réponse BossOz.
Cœur

0

1. Problème:

Il y a un problème avec Xcode 11.2 dans lequel les storyboards contenant un UITextView entraîneront le blocage de l'application sur les versions du système d'exploitation antérieures à iOS 13.2 si elles sont compilées avec Xcode 11.2.

Xcode 11.2

Consultez cette documentation Apple .

2. Solution:

La seule solution est de mettre à jour votre Xcode vers 11.2.1 ou 11.3.

Xcode 11.2.1 a été particulièrement publié pour résoudre ce problème de plantage.

entrez la description de l'image ici Consultez cette documentation Apple.

3. Suggestion:

Je vous suggère d'utiliser la dernière version de Xcode 11.3 car cela prend en charge le développement d'applications pour iOS 13.3 et il existe également de nombreuses nouvelles fonctionnalités. Consultez cette documentation Apple .


-1

Ce problème a été corrigé dans Xcode version 11.2.1 et signalé dans les notes de version:

Cette mise à jour corrige un problème critique pouvant entraîner le blocage des applications utilisant UITextView

Capture d'écran des notes de mise à jour de Xcode

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.