Meine App wurde gerade für die Verwendung des Anzeigenunterstützungs-Frameworks abgelehnt. Welche Bibliothek ist verantwortlich?

81

Dies war einfach ein Update, das nichts mit dem Ablehnungsgrund zu tun hatte. Hier ist die Antwort vom Auflösungszentrum:

Gründe Programm Lizenzvereinbarung PLA 3.3.12

Wir haben festgestellt, dass Ihre App den iOS Advertising Identifier verwendet, jedoch keine Anzeigenfunktionalität enthält. Dies entspricht nicht den Bestimmungen der Lizenzvereinbarung für das iOS-Entwicklerprogramm, wie sie in den Überprüfungsrichtlinien für den App Store vorgeschrieben sind.

In Abschnitt 3.3.12 der Lizenzvereinbarung für das iOS-Entwicklerprogramm heißt es insbesondere:

"Sie und Ihre Anwendungen (und alle Dritten, mit denen Sie einen Vertrag über die Schaltung von Werbung abgeschlossen haben) dürfen die Werbekennung und alle durch die Verwendung der Werbekennung erhaltenen Informationen nur zum Zwecke der Schaltung von Werbung verwenden. Wenn ein Benutzer die zurücksetzt Dann erklären Sie sich damit einverstanden, die vorherige Werbekennung und abgeleitete Informationen weder direkt noch indirekt mit der zurückgesetzten Werbekennung zu kombinieren, zu korrelieren, zu verknüpfen oder auf andere Weise zu verknüpfen. "

Bitte überprüfen Sie Ihren Code - einschließlich aller Bibliotheken von Drittanbietern -, um alle Instanzen von:

Klasse: ASIdentifierManager
Selektor: AdvertisingIdentifier
Framework: AdSupport.framework

Wenn Sie planen, Anzeigen in eine zukünftige Version aufzunehmen, entfernen Sie bitte die Werbekennung aus Ihrer App, bis Sie Anzeigenfunktionen hinzugefügt haben.

Verwenden Sie das Tool "nm", um die Werbekennung zu finden. Um Informationen zum Tool "nm" zu erhalten, öffnen Sie ein Terminalfenster und geben Sie "man nm" ein.

Wenn Sie keinen Zugriff auf die Bibliotheksquelle haben, können Sie die kompilierte Binärdatei möglicherweise mit den Befehlszeilentools "strings" oder "otool" durchsuchen. Das Tool "Strings" listet die Methoden auf, die die Bibliothek aufruft, und "otool -ov" listet die Objective-C-Klassenstrukturen und ihre definierten Methoden auf. Mithilfe dieser Techniken können Sie eingrenzen, wo sich der problematische Code befindet.

Die von mir verwendeten Bibliotheken von Drittanbietern sind die neueste Version von parse.com sdk, latest version of flurry analytics, and version 2.2 of test flight. Weiß jemand, um welche Bibliothek es sich handelt? Vielen Dank

user2844801
quelle
IMO haben sie viele Hinweise gegeben, um diese Suche selbst durchzuführen ... haben Sie es versucht und Sie haben es nicht gefunden?
Adriano Repetti
10
Ich habe Leute gesehen, die dieses Problem mit Google Analytics haben
jcesarmobile
1
Der Hauptgrund, warum Sie markiert werden, ist TestFlight, für das diese ID unerlässlich ist: testflightapp.com/sdk/ios/doc/2.0.0 - "Das AdSupport.framework ist für iOS 6.0+ erforderlich, um eine eindeutige Identifizierung zu ermöglichen Benutzer, damit wir die Anzahl der Benutzer Ihrer App schätzen können (mithilfe von ASIdentifierManager). Möglicherweise verknüpfen Sie das Framework in Ihrer App schwach. Wenn Ihre App nicht mit dem AdSupport.framework verknüpft ist, lädt das TestFlight SDK es automatisch für Apps, auf denen ausgeführt wird iOS 6.0+. "
Louis St-Amour
5
Es stellte sich heraus, dass Testflight v2.2.0 der Konflikt war. Sie haben es seitdem gemäß ihrem Änderungsprotokoll behoben: Konsolidieren Sie beide SDK-Versionen zu einer, die jeglichen Zugriff auf ASIdentifierManager
user2844801
5
Wenn das AdSupport.framework als optional verknüpft ist, würde dies das Problem mit dem App Store lösen?
Legoless

Antworten:

112

Im Terminal:

  1. Wechseln Sie in den Stammordner Ihres Projekts
  2. Typ: grep -r advertisingIdentifier . (der Punkt am Ende ist kritisch)

Dadurch wird jede Datei rekursiv überprüft und Sie erhalten den Namen der fehlerhaften Bibliothek.

(In meinem Fall war es Flurry)

Adam
quelle
1
Ich wurde auch mit der gleichen Sache getroffen. libFlurry_4.3.1.a und libGoogleAnalyticsServices.a haben beide einen AdvertisingIdentifier. Ich weiß nicht, wann diese aktualisiert werden oder ob es irgendwelche Probleme gibt.
Vidal Graupera
2
Was tun wir dagegen? Wir können unsere Analysen nicht einfach ganz entfernen ...
Nir Golan
@ RedYeti - danke, dass du meinen Tippfehler behoben hast! Entschuldigung - Fehler beim Kopieren / Einfügen :(.
Adam
1
@LouWeed - In diesem Fall müssen Sie Flurry aus Ihren Apps entfernen und davon ausgehen, dass Flurry in Panik gerät und SEHR bald ein neues Update bereitstellen wird. Der Nachteil der Verwendung von kostenlosen Analysen von Drittanbietern ist, dass sie manchmal so vermasseln. Ich hatte in der Vergangenheit ähnliche Erfahrungen mit Flurry, TestFlight, Facebook, Parse und einigen anderen. Es passiert. Aber wenn Sie nicht für den Service bezahlen, können Sie sich nicht viel beschweren :)
Adam
2
Kann bestätigen, dass Flurry 4.3.2 bei Verwendung des obigen Befehls nicht mit AdvertisingIdentifier übereinstimmt.
Crafterm
17

Aktualisieren

Google hat das iOS SDK v3.03c von Google Analytics Services veröffentlicht, mit dem die Abhängigkeit von AdSupport.framework standardmäßig entfernt wird.

Vollständiger Änderungsprotokolleintrag für Release Version 3.03c (19. Februar 2014): https://developers.google.com/analytics/devguides/collection/ios/changelog

Alter Awnser

Mein Problem war mit Google Analytics und TestFlight.

Für TestFlight aktualisiere ich einfach die Bibliothek auf die Version 2.2.1 ( https://www.testflightapp.com/sdk/ios/release_notes/2.2.1/ ).

Für die Aktualisierung von Google Analytics musste ich jedoch das Flag -ObjC entfernen. Da ich jedoch Cocoapods zum Verwalten einiger dritter Bibliotheken verwende, konnte ich sie nicht einfach entfernen. Also habe ich folgendes gemacht:

1 - Aktualisierung von libGoogleAnalytics.a auf Version 3.03a (5. Februar 2014)

2 - dann wurde auch das AdSupport.framework entfernt

3 - "-force_load \" $ {PROJECT_DIR} /Source/Library/GoogleAnalyticsServicesiOS_3.03a "" unter "Ziel -> Build-Einstellungen -> Andere Linker-Flags" hinzugefügt (Beachten Sie, dass sich GoogleAnalytics in meinem Projekt in / Source / befindet) Bibliothek / Ordner, und Sie müssen Ihre eigenen konfigurieren)

Da ich das Flag -ObjC nicht entfernen konnte, suchte ich nach der Verwendung des Flags -force_load mit Cocoapods und fand zwei nützliche Links:

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

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

Zusammenfassend habe ich das Flag -ObjC für "-force_load $ (TARGET_BUILD_DIR) /libPods.a" auch unter "Ziel -> Build-Einstellungen -> Andere Linker-Flags" geändert.

Als ich jedoch versuchte, meine App zu veröffentlichen, wurde eine Fehlermeldung angezeigt, dass der Compiler libPods.a nicht gefunden hat. Daher ging ich zu "Ziel -> Build-Einstellungen -> Andere Linker-Flags -> Release" und Ändern Sie diese Zeichenfolge $ (TARGET_BUILD_DIR) in $ {BUILT_PRODUCTS_DIR}.

So wurden meine anderen Linker-Flaggen wie im Bild unten. Andere Linker Flags

Ich hoffe, jemandem zu helfen.

Entschuldigung für mein Englisch. =]

Glauco Neves
quelle
Ich kann meine App immer noch nicht ohne das AdSupport-Framework erstellen. Ich bekomme undefiniertes Symbol ASIIdentifierManager
andygeers
Verwenden Sie Google Tag Manager? Denn wenn Sie es sind, wird diese Lösung nicht funktionieren.
Glauco Neves
Nicht, dass ich wüsste (was macht Tag Manager überhaupt?). Es ist jedoch die kombinierte GA / Tag Manager-Bibliotheksdatei
andygeers
Sie können die Pods / Pods.xcconfig auch OTHER_LDFLAGSdirekt manuell bearbeiten .
Rivera
Google hat heute das iOS SDK v3.03c von Google Analytics Services veröffentlicht. Ich habe meine Antwort aktualisiert. =]
Glauco Neves
13

Für mich waren Flurry Analytics und TestFlight beide das Problem.

Für TestFlight ist es so einfach wie das Aktualisieren. Die Version 2.2.1 verursacht keine Probleme (ich habe die Verwendung von Zeichenfolgen überprüft, wie Apple vorschlägt).

Für Flurry gibt es derzeit keine Lösung außer dem Entfernen von Flurry. Entgegen dem Vorschlag von Lou Weed wird Ihre App abgelehnt, auch wenn AdSupport.framework nicht verlinkt ist.

Hier ist die Antwort des Flurry-Supports:

"Vielen Dank, dass Sie sich an Flurry gewandt haben. Wir haben kürzlich erfahren, dass Apple einige Apps abgelehnt hat, von denen es glaubt, dass sie den IDFA (Identifier for Advertising) ohne Anzeigenfunktion verwenden. Bitte beachten Sie, dass Flurry die IDFA nur erfasst, wenn eine App den AdSupport enthält .framework für Anzeigenfunktionalität. Wir bemühen uns um Klärung mit Apple und werden unsere betroffenen Kunden aktualisieren, sobald wir in den nächsten Tagen mehr erfahren. "

Flurry hat gerade die Version 4.3.2 seines SDK veröffentlicht, die sich speziell mit diesem Problem befasst.

Fradow
quelle
4

Es stellte sich heraus, dass Testflight v2.2.0 der Konflikt war. Sie haben es seitdem gemäß ihrem Änderungsprotokoll behoben:Consolidate both SDK versions into one which removes all access to ASIdentifierManager

user2844801
quelle
4

Crashlytics war das Problem. Wir hatten einige Apps deswegen abgelehnt. Aber ich habe bereits mit Crashlytics gesprochen und sie haben heute ein neues Update (Version 2.1.6) veröffentlicht, das dieses Problem behebt.

Einige Bibliotheken verfügen über das AdSupport.framework, verwenden es jedoch nur, wenn es ausdrücklich aufgerufen wird. Crashlytics rief das Framework auf, weil überprüft werden musste, ob die App Anzeigen unterstützt. Und diese Änderung wurde in Version 2.1.5 implementiert

Wenn Sie also Crashlytics verwenden, ist dies der wahrscheinlichste Grund. Um dies zu beheben, archivieren Sie einfach Ihre App erneut, damit Crashlytics die neue Version mit diesem Fix verwenden kann.

Antwort des Crashlytics-Teams: "Wir haben gerade ein Update dafür veröffentlicht. Können Sie Ihre App bei geöffneter Mac-App erstellen und erneut ausführen, damit Ihr SDK aktualisiert werden kann? Danach können Sie loslegen! Halten Sie mich danach auf dem Laufenden." Sie reichen erneut ein :) "

PS: Dies beginnt, weil Apple anscheinend seine Richtlinien für die Verwendung von ADSupport geändert hat.

gmogames
quelle
3

Ich hatte zuvor Folgendes in Kommentaren geschrieben und die Leute zu den Terminalbefehlen "strings" oder "otool" geleitet. Die vorgeschlagene Antwort auf die Verwendung von grep gefällt mir jedoch sehr gut. Sie können es also zuerst versuchen. Mein Vorschlag ist, diesem Befehl "git" voranzustellen, weil er so viel schneller ist:

git grep advertisingIdentifier

Wenn das nicht funktioniert, versuchen Sie es (wie bereits erwähnt):

grep -r advertisingIdentifier . 

Was folgt, ist das, was ich zuvor in einem Kommentar oben als Anleitung für Terminalbefehle geschrieben hatte:

Sie können die Dateien Ihres Projekts in Xcode durchsuchen oder versuchen, das AdSupport-Framework zu entfernen, um festzustellen, was zur Erstellungs- / Laufzeit fehlschlägt.

Um das Terminal zu verwenden, klicken Sie auf Spotlight (Suche) und geben Sie Terminal ein. Warten Sie, bis es als Anwendung in den Suchergebnissen angezeigt wird.

Geben Sie im Terminal "cd" gefolgt von einem Leerzeichen ein und ziehen Sie Ihren Xcode-Build-Ordner aus dem Finder in das Terminal. Dies sollte automatisch diesen Ordnernamen eingeben. Drücken Sie die Eingabetaste, und die Verzeichnisse (CD) werden in diesen Ordner geändert.

Geben Sie von dort aus stringsein Leerzeichen, dann den Dateinamen für Ihre Bibliothek oder otoolein Leerzeichen und den Dateinamen für die Bibliothek ein. Sie sollten in der Lage sein, die Tabulatortaste zu drücken, um Dateinamen automatisch zu vervollständigen.

Louis St-Amour
quelle
1

Meine App wurde ebenfalls mit dem gleichen Fehler abgelehnt! Ich habe im neuesten Facebook SDK (3.12) ein Vorkommen von AdvertisingIdentifier gefunden. Vielleicht können Sie Ihre Bibliothek mit der folgenden Methode auf ein Vorkommen überprüfen:

Ich habe das FacebookSDK.framework als Bibliothek im Terminal geöffnet und den folgenden Befehl eingegeben

otool -v -s __TEXT __objc_methname FacebookSDK | Grep AdvertisingIdentifier

Aber ich weiß nicht was ich tun soll. Wurde meine App aufgrund dieser Referenz abgelehnt? Wenn ja, was tun, wenn ich Facebook-Funktionen in meiner App verwenden möchte?

Bolonn
quelle
1
Hier sollte dies helfen - stackoverflow.com/questions/21574680/…
Andrew
Danke für die Antwort! Ich habe die Änderungen vorgenommen und meine App erneut eingereicht, hoffe, dass sie nicht wieder abgelehnt wird :)
Bolonn
@bolonn - Wurde Ihre App nach den oben genannten Änderungen von Apple genehmigt?
RoHaN
Ja, es wurde genehmigt!
Bolonn
1

Dies ist etwas komplizierter als es an der Oberfläche scheint. Nach einigen Experimenten stellte ich fest, dass das AdSupport Framework verknüpft ist, auch wenn nur direkt auf Klassen zugegriffen wird, auf die im AdSupport Framework verwiesen wird. Ironischerweise [AsIdentifierManager class]wird dies tatsächlich der Fall sein, der in vielen Bibliotheken von Drittanbietern verwendet wird, um zu überprüfen, ob das AdSupport Framework verknüpft wurde oder nicht dazu führen , der AdSupport Rahmen verknüpft werden. Durch NSClassFromString(@"AsIdentfierManager")die Verschleierung der Klasse mithilfe von wird das AdSupport-Framework nicht automatisch verknüpft. Natürlich befindet sich dieser Code die meiste Zeit in Bibliotheken von Drittanbietern, sodass Sie nicht viel Kontrolle darüber haben. Dies ist jedoch der Fall.

Ich habe auf GitHub ein Beispielprojekt erstellt, das dieses Verhalten mithilfe des Segment.io-Frameworks veranschaulicht. https://github.com/distefam/AdSupportDemo

Michael DiStefano
quelle
Danke für den nützlichen Beitrag. Wenn wir also ein Framework (optional) mit einem schwachen Link zum Projekt verknüpfen (in meinem Fall das Google-Anzeigenframework mit dem Namen "GoogleInteractiveMediaAds"), das AdSupport.framework enthält, wenn ich meine App sende, obwohl meine App keine anzeigt Anzeigen (haben eine kostenpflichtige Version, in der überhaupt keine Anzeigen geschaltet werden). Wird sie von Apple abgelehnt?
C0D3
0

Flurry Analytics verwendet diese API ebenfalls.
Terminalausgang:

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

Laut Flurry wird der Selektor nicht aufgerufen, wenn das AdSupport-Framework nicht verknüpft ist.
Also habe ich das Framework entfernt und erneut versucht, es einzureichen.

Nir Golan
quelle