J'ai essayé de mettre en œuvre des annonces natives Google adMob dans mon application iOS et j'ai suivi le didacticiel officiel d'admob: https://developers.google.com/admob/ios/native/advanced

Que j'aie ajouté le framework admob requis manuellement ou par CocoaPods, toutes les classes des frameworks admob n'ont pas été détectées par le constructeur d'interface, donc je ne pouvais pas définir la classe Custom de UIView sur les classes de vue admob voulues. Mais bizarrement, je pourrais utiliser toutes les classes liées à admob après l'importation du framework dans mes fichiers swift. Voir la capture d'écran ci-dessous:

enter image description here

enter image description here

J'ai trouvé un projet github, qui n'a fait que mettre en œuvre l'annonce native admob par Cocoapoding le framework admob (lien du projet). J'ai téléchargé son code source et curieusement, les classes du framework admob peuvent être détectées par face d'interface dans ce projet.

enter image description here

Je me gratte la tête depuis quelques jours et cherche la solution sans succès. S'il vous plaît, aidez-moi si vous avez une idée de pourquoi cela s'est produit et que votre aide est très appréciée.

2
marcel 24 févr. 2021 à 07:32

3 réponses

Meilleure réponse

TL; DR

Rétrograder la version du pod CocoaPods vers 7.67.0. (-:

Podfile

pod 'Google-Mobile-Ads-SDK', '7.67.0'

Explication

En effet, GoogleMobileAds.framework est devenu GoogleMobileAds.xcframework dans 7.68.0+ - source. Cela signifie que le runtime Objective C diffère entre le framework (iOS 9) et la cible principale (iOS 14.0+). Les XCFramework sont un type spécial de framework binaire , donc la modification manuelle de la version iOS une fois qu'elle a déjà été compilée ne fera aucune différence, et en fait, même si vous spécifiez un iOS version dans votre Podfile cela ne fera aucune différence.

Le code principal a un runtime Objective-C différent et plus rapide sous le capot, et suit donc les classes en utilisant différentes structures de données vers le XCFramework. Par exemple, si une catégorie est définie dans le framework, elle sera stockée dans la mémoire en lecture-écriture même si la nouvelle méthode remplacée n'est pas utilisée (au moment de l'exécution). D'autre part, le runtime Objective-C dans iOS 14.0+ ne charge pas ces méthodes tant qu'elles ne sont pas utilisées pour économiser de la RAM. Il s'agit d'un changement radical pour les anciennes versions d'iOS, car les anciennes structures de données utilisées pour indexer ces classes n'incluent plus les méthodes de catégorie (dans la même zone de stockage) et la logique dépendante (qui lit ces structures de données) dans le cadre ne fonctionnera plus. Le swizzling de méthode est géré différemment et c'est ce que GoogleUtilities fait également (une dépendance de GoogleMobileAds), ce qui peut entraîner des problèmes. Donc, même si IB Autocomplete ne fonctionne pas (pas de gros problème), la classe ne sera pas trouvée dynamiquement au moment de l'exécution. Je n'ai pas mentionné les changements apportés à method list les changements de représentation sous le capot dans le nouveau runtime car cela est hors de portée pour cette question, mais les anciennes listes de méthodes seront toujours utilisables au moment de l'exécution ( changement sans rupture < / strong>).

Pour contourner ce problème, utilisez simplement la version 7.67.0 dans votre Podfile pour le moment. Vous ne pouvez rien faire d'autre à ce sujet en tant que utilisateur final du framework, car podspec spécifie le type de framework comme vendored_framework et ceci n'est modifiable que dans le code source du framework. J'ai essayé de désactiver use_frameworks mais cela ne compile pas. Si vous pouvez modifier le podspec pour vos propres frameworks, le passage à un framework statique est une solution viable (avec des mises en garde). Le framework est lié au moment de la construction au lieu du temps de chargement pour les frameworks statiques, vous devriez donc pouvoir voir la classe du framework dans IB, mais vous devez ensuite rendre les pods dépendants du framework également statiques (plus de travail). L'équivalent le plus simple consiste simplement à rétrograder le pod ou à désactiver use_frameworks dans le Podfile. Cependant, les frameworks ont des performances plus rapides (temps de liaison) et sont généralement préférés, c'est pourquoi ils sont activés par défaut pour les CocoaPods.

J'aurais également suggéré de créer un nouveau problème GitHub pour ce bogue, mais il semble que le SDK n'est pas open-source. Peut-être que ce bogue sera résolu par Apple à l'avenir, ou par Google une fois qu'ils en auront pris connaissance, mais c'est une solution de contournement pour l'instant.

1
Pranav Kasetti 4 mars 2021 à 23:43

Essayez de modifier le XML de votre Storyboard pour résoudre ce problème.

  • Cliquez avec le bouton droit sur votre storyboard ou constructeur d'interface.
  • Sélectionnez le contrôleur de vue ou la vue et accédez au panneau Navigateur de projet et sélectionnez le choix de menu Ouvrir en tant que-> SourceCode.
  • ajoutez l'attribut customClass = "GADUnifiedNativeAdvView"

Enregistrez le storyboard ou la vue.

Cliquez à nouveau avec le bouton droit sur votre storyboard / vue dans le panneau Navigateur de projet et sélectionnez Ouvrir en tant que-> Interface Builder

J'espère que vous verrez le nom de la classe personnalisée.

0
pkc456 1 mars 2021 à 17:34

1: installation du pod - installation propre

2: ouvrez Xcode et shit-command-k

3: fermez Xcode et rouvrez

4: prenez le café et attendez que la pré-construction de xcode soit terminée

0
hasayakey 5 mars 2021 à 11:21