web-dev-qa-db-fra.com

Mon application vient d'être rejetée pour l'utilisation de la structure de support publicitaire. Quelle bibliothèque est responsable?

C'était simplement une mise à jour qui ne changeait rien à la raison du rejet. Voici la réponse du centre de résolution:

Raisons Accord de licence du programme PLA 3.3.12

Nous avons constaté que votre application utilise l'identifiant publicitaire iOS, mais n'inclut pas la fonctionnalité d'annonce. Ceci n'est pas conforme aux termes du contrat de licence du programme pour développeurs iOS, comme requis par les directives de révision de l'App Store.

Plus précisément, la section 3.3.12 du contrat de licence du programme pour développeurs iOS stipule:

"Vous et vos applications (ainsi que tout tiers avec lequel vous avez passé un contrat avec une agence de publicité) pouvez utiliser l'identificateur de publicité et toute information obtenue à l'aide de celui-ci uniquement à des fins de publication d'annonces. Si un utilisateur réinitialise le Identifiant publicitaire, vous acceptez de ne pas combiner, corréler, lier ou associer de quelque manière que ce soit, directement ou indirectement, l'identifiant publicitaire précédent et toute information dérivée avec l'identifiant publicitaire réinitialisé. "

Veuillez vérifier votre code - y compris les bibliothèques tierces - pour supprimer toute instance de:

classe: ASIdentifierManager
Sélecteur : advertisingIdentifier
cadre: AdSupport.framework

Si vous envisagez d'intégrer des annonces dans une version ultérieure, supprimez l'identifiant de publicité de votre application jusqu'à ce que vous ayez inclus la fonctionnalité d'annonce.

Pour vous aider à localiser l'identifiant de publicité, utilisez l'outil "nm". Pour plus d'informations sur l'outil "nm", ouvrez une fenêtre de terminal et entrez "man nm".

Si vous n'avez pas accès à la source des bibliothèques, vous pourrez peut-être effectuer une recherche dans le binaire compilé à l'aide des outils de ligne de commande "strings" ou "otool". L'outil "chaînes" répertorie les méthodes appelées par la bibliothèque et "otool -ov" répertorie les structures de classe Objective-C et leurs méthodes définies. Ces techniques peuvent vous aider à préciser l'emplacement du code problématique.

Les bibliothèques tierces que j'utilise sont la dernière version de parse.com sdk, latest version of flurry analytics, and version 2.2 of test flight. Est-ce que quelqu'un sait quelle bibliothèque est la question? Merci

81
user2844801

Dans le terminal:

  1. Allez dans le dossier racine de votre projet
  2. Type: grep -r advertisingIdentifier .(le point à la fin est critique)

Cela vérifiera chaque fichier de manière récursive et vous donnera le nom de la bibliothèque incriminée.

(dans mon cas, c'était Flurry)

112
Adam

Mettre à jour

Google a publié le SDK v3.03c iOS de Google Analytics Services qui supprime la dépendance AdSupport.framework par défaut.

Entrée complète du journal des modifications pour la version 3.03c (19 février 2014): https://developers.google.com/analytics/devguides/collection/ios/changelog

Old Awnser

Mon problème était avec Google Analytics et TestFlight.

Pour TestFlight, je viens de mettre à jour la bibliothèque vers la version 2.2.1 ( https://www.testflightapp.com/sdk/ios/release_notes/2.2.1/ ).

Mais pour mettre à jour Google Analytics, je devais supprimer le drapeau -ObjC. Mais comme j'utilise Cocoapods pour gérer certaines des troisièmes bibliothèques, je ne peux pas simplement les supprimer. Alors j'ai fait ce qui suit:

1 - a commencé à mettre à jour libGoogleAnalytics.a vers la version 3.03a (5 février 2014)

2 - puis enlevé aussi le AdSupport.framework

3 - ajouté "-force_load \" $ {PROJECT_DIR} /Source/Library/GoogleAnalyticsServicesiOS_3.03a "" sous "Cible -> Paramètres de construction -> Autres drapeaux de l'éditeur de liens" (Notez que dans mon projet, GoogleAnalytics est dans/Source/Bibliothèque/dossier, et vous devez configurer le vôtre)

Mais comme je ne pouvais pas supprimer -ObjC flag, j'ai recherché comment utiliser l'indicateur -force_load avec Cocoapods, puis j'ai trouvé deux liens utiles:

1 - https://github.com/CocoaPods/CocoaPods/issues/712

2 - http://www.deanmao.com/2012/12/31/linker-error-using-cocoapods/

Pour résumer, j'ai modifié l'indicateur -ObjC pour "-force_load $ (TARGET_BUILD_DIR) /libPods.a" également sous "Cible -> Paramètres de construction -> Autres drapeaux de l'éditeur de liens"

Mais encore une fois, quand j'ai essayé de publier mon application, une erreur s'est produite en me disant que le compilateur n'a pas trouvé libPods.a, je suis donc allé à "Cible -> Paramètres de construction -> Autres drapeaux de l'éditeur de liens -> Libérer" et remplacez cette chaîne $ (TARGET_BUILD_DIR) par $ {BUILT_PRODUCTS_DIR}.

Donc, mes autres drapeaux de lieur sont devenus comme l'image ci-dessous. Other Linker Flags

J'espère aider quelqu'un.

Désolé pour mon anglais. =]

17
Glauco Neves

Pour moi, Flurry Analytics et TestFlight étaient à la fois le problème.

Pour TestFlight, c'est aussi simple que de le mettre à jour. La version 2.2.1 ne posera aucun problème (j'ai vérifié en utilisant des chaînes, comme Apple suggère))

Pour Flurry, il n'y a actuellement aucun correctif mis à part l'enlèvement de Flurry, et contrairement à la suggestion de Lou Weed, même si AdSupport.framework n'est pas lié, votre application sera rejetée.

Voici la réponse du support Flurry:

"Merci d'avoir contacté Flurry. Nous avons récemment appris que Apple a rejeté certaines applications qui, à son avis, utilisent l'identifiant pour la publicité (IDFA) sans inclure de fonctionnalités publicitaires. Veuillez noter que Flurry ne collecter l'IDFA sauf si une application inclut la fonctionnalité AdSupport.framework pour les annonces. Nous souhaitons obtenir des éclaircissements avec Apple) et nous mettrons à jour nos clients concernés à mesure que nous en saurons plus au cours des prochains jours. "

Flurry vient de publier la version 4.3.2 de leur SDK, qui aborde spécifiquement ce problème.

13
Fradow

Crashlytics était le problème. Nous avons eu quelques applications rejetées à cause de cela. Mais j'ai déjà parlé à Crashlytics et ils ont publié aujourd'hui une nouvelle mise à jour (version 2.1.6) qui résout ce problème.

Plusieurs bibliothèques ont AdSupport.framework mais ne l'utilisent que si elles sont spécifiquement appelées. Crashlytics appelait le framework car il devait vérifier si l'application supportait les publicités. Et ce changement a été mis en œuvre sur la version 2.1.5

Donc, si vous utilisez crashlytics, c'est la raison la plus probable. Pour résoudre ce problème, il suffit de ré-archiver votre application afin que crashlytics puisse utiliser la nouvelle version avec ce correctif.

Réponse de l’équipe Crashlytics: "Nous venons de publier une mise à jour pour cette application. Pouvez-vous créer et exécuter à nouveau votre application avec l’application Mac ouverte pour qu’elle puisse mettre à jour votre SDK? Vous pourrez continuer après! Tenez-moi au courant après vous soumettez à nouveau :) "

PS: Cela commence à se produire parce que Apple semble avoir modifié sa politique d'utilisation d'ADSupport.

4
gmogames

Il s'avère que le Testflight v2.2.0 était le conflit. Ils l'ont depuis corrigé en fonction de leur changelog: Consolidate both SDK versions into one which removes all access to ASIdentifierManager

4
user2844801

J'avais précédemment écrit ce qui suit dans des commentaires, dirigeant les gens vers les commandes de terminal "chaînes" ou "otool". Cependant, j'aime beaucoup la réponse suggérée consistant à utiliser grep. Vous pouvez donc l'essayer en premier. Ma suggestion est de faire précéder "git" de cette commande, car elle est beaucoup plus rapide:

git grep advertisingIdentifier

Si cela ne fonctionne pas, essayez (comme indiqué précédemment):

grep -r advertisingIdentifier . 

Ce qui suit est ce que j'avais précédemment écrit dans un commentaire ci-dessus, en tant que guide pratique pour les commandes de terminal:

Vous pouvez rechercher les fichiers de votre projet dans Xcode ou essayer de supprimer le framework AdSupport pour voir ce qui échoue lors de la génération/de l'exécution.

Pour utiliser le terminal, cliquez sur Spotlight (recherche) et tapez Terminal. Attendez qu'il apparaisse comme une application dans les résultats de la recherche.

Une fois dans Terminal, tapez "cd" suivi d'un espace, puis faites glisser votre dossier de construction Xcode du Finder vers le Terminal. Cela devrait taper automatiquement ce nom de dossier. Appuyez sur Entrée, et cela changera de répertoire (cd) dans ce dossier.

À partir de là, tapez strings puis un espace, puis le nom de fichier de votre bibliothèque ou otool, un espace et le nom de fichier de la bibliothèque. Vous devriez pouvoir appuyer sur TAB pour compléter automatiquement les noms de fichiers.

3
Louis St-Amour

Mon application a également été rejetée avec la même erreur! J'ai trouvé une occurrence de advertisingIdentifier dans le dernier SDK de Facebook (3.12). Peut-être que vous pouvez vérifier l'occurrence de votre bibliothèque avec la méthode ci-dessous:

J'ai ouvert FacebookSDK.framework en tant que bibliothèque dans le terminal et j'ai tapé la commande suivante

otool -v -s __TEXT __objc_methname FacebookSDK | grep advertisingIdentifier

Mais je ne sais pas quoi faire. Mon application a-t-elle été rejetée à cause de cette référence? Si oui que faire si je veux utiliser les fonctionnalités de Facebook dans mon application?

1
bolonn

C'est un peu plus compliqué qu'il n'y parait à la surface. Après quelques expériences, j'ai constaté que le cadre AdSupport est lié, même s'il n'accède que directement aux classes référencées dans le cadre AdSupport. Ironiquement, [AsIdentifierManager class], Utilisé dans de nombreuses bibliothèques tierces pour vérifier si AdSupport Framework a été lié ou non, provoquera une cause le cadre AdSupport à lier. Obscurcir la classe en utilisant NSClassFromString(@"AsIdentfierManager") ne fera pas que le framework AdSupport sera automatiquement lié. Bien sûr, la plupart du temps, ce code sera dans des bibliothèques tierces afin que vous ne puissiez pas le contrôler, cependant, c'est ce qui se passe.

J'ai construit un exemple de projet sur GitHub qui illustre ce comportement en utilisant le framework Segment.io. https://github.com/distefam/AdSupportDemo

1
Michael DiStefano

Flurry Analytics utilise également cette API.
Sortie du terminal:

Binary file ./Lib/Flurry/libFlurry_4.3.0.a matches

Flurry indique que le sélecteur n'est pas appelé si la structure AdSupport n'est pas liée.
J'ai donc supprimé le cadre et essayé de le soumettre à nouveau.

0
Nir Golan