Moja aplikacja została właśnie odrzucona z powodu korzystania z platformy obsługi reklam. Która biblioteka jest odpowiedzialna?

81

To była po prostu aktualizacja, która nie zmieniła nic wspólnego z przyczyną odrzucenia. Oto odpowiedź z centrum rozstrzygania sporów:

Powody Umowa licencyjna programu PLA 3.3.12

Wykryliśmy, że Twoja aplikacja używa identyfikatora reklamowego iOS, ale nie zawiera funkcji reklamowej. Nie jest to zgodne z warunkami Umowy licencyjnej programu iOS Developer, zgodnie z wymogami wytycznych App Store Review.

W szczególności sekcja 3.3.12 Umowy licencyjnej programu iOS Developer stwierdza:

„Ty i Twoje Aplikacje (oraz wszelkie osoby trzecie, z którymi zawarliście umowę na wyświetlanie reklam) mogą Państwo używać Identyfikatora reklamowego i wszelkich informacji uzyskanych za pomocą Identyfikatora reklamowego wyłącznie w celu dostarczania reklam. Jeśli użytkownik zresetuje Identyfikator reklamowy, Użytkownik zobowiązuje się nie łączyć, nie łączyć, nie łączyć ani w żaden inny sposób nie wiązać, bezpośrednio ani pośrednio, poprzedniego identyfikatora reklamy i żadnych informacji pochodnych ze zresetowanym identyfikatorem reklamy. "

Sprawdź swój kod - w tym wszelkie biblioteki innych firm - aby usunąć wszelkie wystąpienia:

class: ASIdentifierManager
selector: advertisingIdentifier
framework: AdSupport.framework

Jeśli planujesz włączyć reklamy w przyszłej wersji, usuń identyfikator reklamowy z aplikacji, dopóki nie włączysz funkcji reklam.

Aby pomóc w zlokalizowaniu identyfikatora reklamowego, użyj narzędzia „nm”. Aby uzyskać informacje o narzędziu „nm”, otwórz okno terminala i wpisz „man nm”.

Jeśli nie masz dostępu do źródeł bibliotek, możesz przeszukać skompilowany plik binarny za pomocą narzędzi wiersza poleceń „string” lub „otool”. Narzędzie „stringi” wyświetla listę metod wywoływanych przez bibliotekę, a „otool -ov” wyświetli listę struktur klas Objective-C i ich zdefiniowanych metod. Techniki te mogą pomóc ci zawęzić, gdzie znajduje się problematyczny kod.

Biblioteki innych firm, których używam, to najnowsza wersja parse.com sdk, latest version of flurry analytics, and version 2.2 of test flight. Czy ktoś wie, która biblioteka jest problemem? Dzięki

user2844801
źródło
IMO dostarczyli wiele wskazówek, aby przeprowadzić to wyszukiwanie samodzielnie ... próbowałeś i nie znalazłeś tego?
Adriano Repetti
10
Widziałem ludzi mających ten problem z Google Analytics
jcesarmobile
1
Jednak największym powodem, dla którego zostałbyś oznaczony, jest TestFlight, dla którego ten identyfikator jest niezbędny: testflightapp.com/sdk/ios/doc/2.0.0 - „AdSupport.framework jest wymagany dla systemu iOS 6.0+ w celu jednoznacznej identyfikacji użytkowników, abyśmy mogli oszacować liczbę użytkowników, których ma Twoja aplikacja (za pomocą ASIdentifierManager). Możesz słabo powiązać strukturę w swojej aplikacji. Jeśli Twoja aplikacja nie jest połączona z AdSupport.framework, pakiet TestFlight SDK automatycznie załaduje ją dla aplikacji działających na iOS 6.0+ ”.
Louis St-Amour
5
Okazuje się, że konflikt dotyczył Testflight v2.2.0. Od tego czasu naprawili to zgodnie z ich dziennikiem zmian: Skonsoliduj obie wersje SDK w jedną, która usuwa cały dostęp do ASIdentifierManager
user2844801
5
Jeśli łącze AdSupport.framework jest opcjonalne, czy rozwiązałoby to problem z App Store?
Bezprawny

Odpowiedzi:

114

W terminalu:

  1. Przejdź do folderu głównego swojego projektu
  2. Typ: grep -r advertisingIdentifier . (kropka na końcu ma znaczenie krytyczne)

Spowoduje to rekurencyjne sprawdzenie każdego pliku i podanie nazwy naruszającej biblioteki.

(w moim przypadku był to Flurry)

Adam
źródło
1
Trafiłem też w to samo. libFlurry_4.3.1.a i libGoogleAnalyticsServices.a mają identyfikator advertisingIdentifier. Nie wiem, kiedy zostaną one zaktualizowane lub czy istnieje jakieś obejście.
Vidal Graupera
2
co z tym robimy? nie możemy po prostu całkowicie usunąć naszych danych analitycznych ...
Nir Golan,
@RedYeti - dzięki za poprawienie mojej literówki! Przepraszamy za to - błąd kopiowania / wklejania :(.
Adam
1
@LouWeed - kiedy to się stanie, musisz usunąć Flurry ze swoich aplikacji i założyć, że Flurry panikuje i BARDZO wkrótce dostarczy nową aktualizację. Wadą korzystania z bezpłatnych narzędzi analitycznych innych firm jest to, że czasami tak się psują. W przeszłości miałem podobne problemy z Flurry, TestFlight, Facebookiem, Parse i kilkoma innymi. Zdarza się. Ale jeśli nie płacisz za usługę, nie możesz narzekać :)
Adam,
2
Potwierdza, że ​​Flurry 4.3.2 nie pasuje do advertisingIdentifier podczas korzystania z powyższego polecenia.
crafterm
17

Aktualizacja

Google wypuścił Google Analytics Services iOS SDK v3.03c, który domyślnie usuwa zależność AdSupport.framework.

Pełny wpis w dzienniku zmian dotyczący wydania wersji 3.03c (19 lutego 2014 r.): Https://developers.google.com/analytics/devguides/collection/ios/changelog

Old Awnser

Mój problem dotyczył Google Analytics i TestFlight.

W przypadku TestFlight po prostu aktualizuję bibliotekę do wersji 2.2.1 ( https://www.testflightapp.com/sdk/ios/release_notes/2.2.1/ ).

Ale aby zaktualizować Google Analytics, musiałem usunąć flagę -ObjC. Ale ponieważ używam Cocoapods do zarządzania niektórymi trzecimi bibliotekami, nie mogłem go tak po prostu usunąć. Więc zrobiłem co następuje:

1 - rozpoczęto aktualizację libGoogleAnalytics.a do wersji 3.03a (5 lutego 2014)

2 - następnie usunięto również AdSupport.framework

3 - dodano "-force_load \" $ {PROJECT_DIR} /Source/Library/GoogleAnalyticsServicesiOS_3.03a "" w "Cel -> Ustawienia kompilacji -> Inne flagi łącznika" (Zauważ, że w moim projekcie GoogleAnalytics jest w / Source / Biblioteka / folder i musisz skonfigurować własne)

Ale ponieważ nie mogłem usunąć flagi -ObjC, szukałem sposobu użycia flagi -force_load z Cocoapods, a następnie znalazłem dwa przydatne linki:

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

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

Podsumowując, zmieniłem flagę -ObjC na "-force_load $ (TARGET_BUILD_DIR) /libPods.a" również w "Cel -> Ustawienia kompilacji -> Inne flagi konsolidatora"

Ale znowu, kiedy próbowałem opublikować moją aplikację, pojawił się błąd informujący mnie, że kompilator nie znalazł libPods.a, więc poszedłem do „Cel -> Ustawienia kompilacji -> Inne flagi konsolidatora -> Wersja” i zmień ten ciąg $ (TARGET_BUILD_DIR) na $ {BUILT_PRODUCTS_DIR}.

Więc moje inne flagi łączące stały się takie jak na poniższym obrazku. Inne flagi konsolidatora

Mam nadzieję, że komuś pomogę.

Przepraszam za mój angielski. =]

Glauco Neves
źródło
Nadal nie mogę zbudować mojej aplikacji bez frameworka AdSupport. Otrzymuję niezdefiniowany symbol ASIIdentifierManager
andygeers
Czy używasz Menedżera tagów Google? Bo jeśli tak, to rozwiązanie nie zadziała.
Glauco Neves
Nie żebym wiedział (czym w ogóle zajmuje się Menedżer tagów?) Jest to jednak połączony plik biblioteki GA / Menedżera tagów
andygeers,
Możesz także ręcznie edytować OTHER_LDFLAGSbezpośrednio pliki Pods / Pods.xcconfig .
Rivera
Firma Google udostępniła dzisiaj pakiet SDK usług Google Analytics dla systemu iOS w wersji 3.03c. Zaktualizowałem odpowiedź. =]
Glauco Neves
13

Dla mnie problemem były zarówno Flurry Analytics, jak i TestFlight.

W przypadku TestFlight jest to tak proste, jak aktualizacja. Wersja 2.2.1 nie sprawi żadnego problemu (sprawdziłem za pomocą stringów, jak sugeruje Apple)

W przypadku Flurry obecnie nie ma rozwiązania poza usunięciem Flurry i wbrew sugestii Lou Weed, nawet jeśli AdSupport.framework nie jest połączony, Twoja aplikacja zostanie odrzucona.

Oto odpowiedź zespołu pomocy Flurry:

„Dziękujemy za skontaktowanie się z Flurry. Niedawno dowiedzieliśmy się, że firma Apple odrzuciła niektóre aplikacje, które jego zdaniem używają identyfikatora reklamy (IDFA) bez funkcji reklamowej. Należy pamiętać, że firma Flurry nie zbiera IDFA, chyba że aplikacja zawiera obsługę AdSupport .framework dla funkcjonalności reklam. Poszukujemy wyjaśnień z Apple i będziemy aktualizować naszych klientów, których to dotyczy, w miarę zdobywania dodatkowych informacji w ciągu najbliższych kilku dni. ”

Flurry właśnie opublikował wersję 4.3.2 swojego zestawu SDK, która w szczególności rozwiązuje ten problem.

Fradow
źródło
4

Okazuje się, że konflikt dotyczył Testflight v2.2.0. Od tego czasu naprawili to zgodnie z ich dziennikiem zmian:Consolidate both SDK versions into one which removes all access to ASIdentifierManager

user2844801
źródło
4

Problem był Crashlytics. Z tego powodu odrzuciliśmy kilka aplikacji. Ale rozmawiałem już z Crashlytics i wydali dzisiaj nową aktualizację (wersja 2.1.6), która rozwiązuje ten problem.

Kilka bibliotek ma AdSupport.framework, ale nie używają go, chyba że zostaną specjalnie wywołane. Crashlytics wywoływał framework, ponieważ musiał sprawdzić, czy aplikacja obsługuje reklamy. I ta zmiana została wprowadzona w wersji 2.1.5

Więc jeśli używasz crashlytics, to jest najbardziej prawdopodobny powód. Aby to naprawić, po prostu ponownie zarchiwizuj aplikację, aby crashlytics mógł używać nowej wersji z tą poprawką.

Odpowiedź zespołu Crashlytics: „Właśnie opublikowaliśmy aktualizację w tym zakresie - czy możesz ponownie zbudować i uruchomić swoją aplikację z otwartą aplikacją na Maca, aby mogła zaktualizować pakiet SDK? Wszystko będzie dobrze! Poinformuj mnie o tym później prześlij ponownie :) ”

PS: Zaczyna się to dziać, ponieważ wydaje się, że Apple zmienił swoje zasady dotyczące korzystania z ADSupport.

gmogames
źródło
3

Wcześniej napisałem w komentarzach następujące informacje, kierując ludzi do poleceń terminala „string” lub „otool”. Jednak bardzo podoba mi się sugerowana odpowiedź dotycząca używania grep. Więc możesz spróbować najpierw. Moją sugestią jest dodanie „git” do tego polecenia, ponieważ jest o wiele szybsze:

git grep advertisingIdentifier

Jeśli to nie zadziała, spróbuj (jak napisano wcześniej):

grep -r advertisingIdentifier . 

Poniżej znajduje się to, co wcześniej napisałem w komentarzu powyżej, jako poradnik dotyczący poleceń terminala:

Możesz przeszukać pliki swojego projektu w Xcode lub możesz spróbować usunąć strukturę AdSupport, aby zobaczyć, co się nie udaje w czasie kompilacji / wykonywania.

Aby skorzystać z terminala, kliknij Spotlight (szukaj) i wpisz Terminal. Poczekaj, aż pojawi się jako aplikacja w wynikach wyszukiwania.

W Terminalu wpisz „cd” i spację, a następnie przeciągnij i upuść folder kompilacji Xcode z Findera do Terminala. Powinno to automatycznie wpisać nazwę tego folderu. Wciśnij Enter, a to zmieni katalogi (cd) na ten folder.

stringsNastępnie wpisz spację, a następnie nazwę pliku dla swojej biblioteki lub otoolspację i nazwę pliku dla biblioteki. Powinieneś być w stanie nacisnąć TAB, aby automatycznie uzupełnić nazwy plików.

Louis St-Amour
źródło
1

Moja aplikacja została również odrzucona z tym samym błędem! Znalazłem wystąpienie AdvertisingIdentifier w najnowszym pakiecie SDK Facebooka (3.12). Może możesz sprawdzić wystąpienie w swojej bibliotece za pomocą poniższej metody:

Otworzyłem FacebookSDK.framework jako bibliotekę w terminalu i wpisałem następujące polecenie

otool -v -s __TEXT __objc_methname FacebookSDK | grep advertisingIdentifier

Ale nie wiem, co robić. Czy moja aplikacja została odrzucona z powodu tego odniesienia? Jeśli tak, co zrobić, jeśli chcę korzystać z funkcji Facebooka w mojej aplikacji?

bolonn
źródło
1
Tutaj to powinno pomóc - stackoverflow.com/questions/21574680/…
Andrew,
Dziękuję za Twoją odpowiedź! Wprowadziłem zmiany i ponownie przesłałem aplikację, mam nadzieję, że nie zostanie ponownie odrzucona :)
bolonn
@bolonn - czy Twoja aplikacja została zatwierdzona przez Apple po wprowadzeniu powyższych zmian?
RoHaN
Tak, zostało zatwierdzone!
bolonn
1

Jest to trochę bardziej skomplikowane, niż się wydaje na pierwszy rzut oka. Po pewnym eksperymencie odkryłem, że AdSupport Framework jest powiązany, nawet jeśli tylko bezpośrednio uzyskuje dostęp do klas, do których odwołuje się AdSupport Framework. Jak na ironię, to [AsIdentifierManager class], które jest używane w wielu bibliotekach stron trzecich do sprawdzania, czy platforma AdSupport została połączona, w rzeczywistości spowoduje połączenie AdSupport Framework. Ukrywanie klasy za pomocą polecenia NSClassFromString(@"AsIdentfierManager")nie spowoduje automatycznego połączenia platformy AdSupport. Oczywiście przez większość czasu ten kod będzie znajdował się w bibliotekach innych firm, więc nie będziesz miał nad nim dużej kontroli, jednak tak się dzieje.

Zbudowałem przykładowy projekt na GitHub, który ilustruje to zachowanie przy użyciu frameworka Segment.io. https://github.com/distefam/AdSupportDemo

Michael DiStefano
źródło
Dzięki za przydatny post. Kiedy więc osłabimy (opcjonalnie) framework do projektu (w moim przypadku jest to framework reklamowy Google o nazwie „GoogleInteractiveMediaAds”), który zawiera AdSupport.framework w środku, kiedy przesyłam moją aplikację, mimo że moja aplikacja nie wyświetla żadnych reklamy (mają płatną wersję, która nie wyświetla żadnych reklam), czy zostanie odrzucona przez Apple?
C0D3
0

Flurry Analytics również korzysta z tego interfejsu API.
Wyjście terminala:

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

Flurry mówi, że selektor nie jest wywoływany, jeśli platforma AdSupport nie jest połączona.
Dlatego usunąłem ramy i spróbowałem przesłać ponownie.

Nir Golan
źródło