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.frameworkJeś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
źródło
Odpowiedzi:
W terminalu:
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)
źródło
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.
Mam nadzieję, że komuś pomogę.
Przepraszam za mój angielski. =]
źródło
OTHER_LDFLAGS
bezpośrednio pliki Pods / Pods.xcconfig .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.
źródło
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
źródło
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.
źródło
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.
strings
Następnie wpisz spację, a następnie nazwę pliku dla swojej biblioteki lubotool
spację i nazwę pliku dla biblioteki. Powinieneś być w stanie nacisnąć TAB, aby automatycznie uzupełnić nazwy plików.źródło
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?
źródło
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ą poleceniaNSClassFromString(@"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
źródło
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.
źródło