Мое приложение было просто отклонено для использования структуры поддержки объявлений. Какая библиотека несет ответственность?

Это просто обновление, которое ничего не изменило, что связано с причиной отказа. Вот ответ от центра разрешения:

Причины Лицензионное соглашение на программу PLA 3.3.12

Мы обнаружили, что ваше приложение использует идентификатор рекламы iOS, но не включает в себя функциональность объявлений. Это не соответствует условиям Лицензионного соглашения программы разработчика для iOS, как того требует Руководство по проверке App Store.

В частности, в разделе 3.3.12 Лицензионного соглашения программы разработчика iOS говорится:

"Вы и ваши заявки (и любая третьи стороны, с которыми вы заключили контракт на рекламу), могут использовать рекламный идентификатор и любую информацию, полученную с помощью рекламного идентификатора, только для рекламы рекламы. пользователь сбрасывает рекламный идентификатор, тогда вы соглашаетесь не комбинировать, не коррелировать, не связывать, ни иным образом связать, прямо или косвенно, предшествующий рекламный идентификатор и любую полученную информацию с reset рекламным идентификатором."

Пожалуйста, проверьте свой код - включая любые сторонние библиотеки - чтобы удалить все экземпляры:

класс: ASIdentifierManager
селектор: рекламный идентификатор
framework: AdSupport.framework

Если вы планируете включать рекламу в будущую версию, удалите рекламный идентификатор из своего приложения, пока не включите функции объявления.

Чтобы найти идентификатор рекламы, используйте инструмент "nm". Для получения информации о инструменте "nm" откройте окно терминала и введите "man nm".

Если у вас нет доступа к источнику библиотек, вы можете выполнить поиск в скомпилированном двоичном файле с помощью инструментов командной строки "строки" или "otool". В инструменте "Строки" перечислены методы, которые вызывает библиотека, а "otool -ov" перечисляет структуры классов Objective-C и их определенные методы. Эти методы помогут вам сузить место возникновения проблемного кода.

Сторонние библиотеки, которые я использую, являются последней версией parse.com sdk, latest version of flurry analytics, and version 2.2 of test flight. Кто-нибудь знает, в какой библиотеке проблема? Благодаря

Ответ 1

В терминале:

  • Перейдите в корневую папку вашего проекта.
  • Тип: grep -r advertisingIdentifier . (точка на конце критическая)

Это будет рекурсивно проверять каждый файл и указывать имя злоумышленника.

(в моем случае это был Flurry)

Ответ 2

Обновление

Google выпустил Google Analytics Services iOS SDK v3.03c, который по умолчанию отключает зависимость AdSupport.framework.

Полный текст изменений для версии 3.0.03c (19 февраля 2014 года): https://developers.google.com/analytics/devguides/collection/ios/changelog

Старый тент

Моя проблема была в Google Analytics и TestFlight.

Для TestFlight я просто обновляю библиотеку до версии 2.2.1 (https://www.testflightapp.com/sdk/ios/release_notes/2.2.1/).

Но для обновления Google Analytics мне пришлось удалить флаг -ObjC. Но поскольку я использую Cocoapods для управления некоторыми из третьих библиотек, я не мог просто удалить его. Поэтому я сделал следующее:

1 - началось обновление libGoogleAnalytics.a до версии 3.03a (5 февраля 2014 г.)

2 - затем удалили также AdSupport.framework

3 - добавлен "-force_load \" ${PROJECT_DIR}/Source/Library/GoogleAnalyticsServicesiOS_3.03a "в разделе" Цель → Настройки сборки → Другие флаги компоновщика" (Обратите внимание, что в моем проекте GoogleAnalytics находится внутри /Source/Library/folder, и вам нужно настроить свой собственный)

Но поскольку я не могу удалить флаг ObjC, я искал, как использовать флаг -force_load с Cocoapods, тогда я нашел две полезные ссылки:

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

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

Подводя итог, я изменил флаг -ObjC для "-force_load $(TARGET_BUILD_DIR)/libPods.a" также в разделе "Target → Настройки сборки → Другие флаги компоновщика"

Но опять же, когда я попытался опубликовать свое приложение, я получил сообщение об ошибке, сообщающее мне, что компилятор не нашел libPods.a, поэтому я перешел в "Target → Build Settings → Other Linker Flags → Release" и измените эту строку $(TARGET_BUILD_DIR) на ${BUILT_PRODUCTS_DIR}.

Итак, мои другие флаги Linker стали похожими на изображение ниже. Other Linker Flags

Надеюсь помочь кому-то.

Извините за мой английский. =]

Ответ 3

Для меня были проблемы с Flurry Analytics и TestFlight.

Для TestFlight это так же просто, как и обновление. Версия 2.2.1 не вызовет никаких проблем (я проверял использование строк, как полагает Apple)

Для Flurry в настоящее время нет исправления, кроме удаления Flurry, и вопреки предложению Лу Вейда, даже если AdSupport.framework не связан, ваше приложение будет отклонено.

Вот ответ поддержки Flurry:

"Спасибо, что обратились к Flurry. Недавно мы узнали, что Apple отклонила некоторые приложения, которые, по его мнению, используют идентификатор для рекламы (IDFA), не включая функциональность объявлений. Обратите внимание, что Flurry не собирает IDFA, если приложение включает AdSupport.framework для рекламных функций. Мы ищем разъяснения у Apple, и мы обновим наших пострадавших клиентов, поскольку мы узнаем больше в течение следующих нескольких дней".

Flurry только что выпустила версию 4.3.2 своего SDK, которая специально решает эту проблему.

Ответ 4

Выключает Testflight v2.2.0 был конфликт. С тех пор они исправили его в соответствии с их изменением: Consolidate both SDK versions into one which removes all access to ASIdentifierManager

Ответ 5

Crashlytics была проблемой. Из-за этого у нас было несколько приложений. Но я уже говорил с Crashlytics, и сегодня они выпустили новое обновление (версия 2.1.6), которые исправляют эту проблему.

В нескольких библиотеках есть AdSupport.framework, но они не используют их, если они специально не вызваны. Crashlytics вызывал фреймворк, потому что он должен был проверить, поддерживает ли приложение рекламу. И это изменение было реализовано в версии 2.1.5

Итак, если вы используете crashlytics, это самая вероятная причина. Чтобы исправить это, просто переархивируйте приложение, поэтому crashlytics могут использовать новую версию с этим исправлением.

Ответ команды Crashlytics: "Мы просто вытолкнули обновление для этого: можете ли вы снова создать и запустить приложение с открытием приложения Mac, чтобы он мог обновить ваш SDK? После этого вы все хорошо пойдете! Держите меня в курсе после повторной отправки:)"

PS: Это начинает происходить, потому что Apple, похоже, изменила свою политику использования ADSupport.

Ответ 6

Ранее я писал в комментариях, направляя людей к командам терминала "строки" или "otool". Тем не менее, мне очень нравится предложенный ответ использования grep. Поэтому сначала вы можете попробовать. Мое предложение состоит в том, чтобы добавить "git" к этой команде, потому что это намного быстрее:

git grep advertisingIdentifier

Если это не сработает, попробуйте (как опубликовано ранее):

grep -r advertisingIdentifier . 

Далее следует то, что я ранее написал в комментарии выше, как руководство для команд терминала:

Вы можете выполнять поиск файлов проекта в Xcode или попробовать удалить структуру AdSupport, чтобы увидеть, что происходит с ошибкой при создании/запуске.

Чтобы использовать терминал, нажмите Spotlight (поиск) и введите Terminal. Подождите, пока он появится как приложение в результатах поиска.

В терминале введите "cd", затем пробел, а затем перетащите папку Xcode build из Finder в Terminal. Это должно автоматически вводить имя этой папки. Нажмите Enter, и он изменит каталоги (cd) в эту папку.

Оттуда введите strings, затем пробел, затем имя файла для вашей библиотеки или otool, пробел и имя файла для библиотеки. Вы должны иметь возможность удалять TAB для автоматического заполнения имен файлов.

Ответ 7

Мое приложение также было отклонено с той же ошибкой! Я обнаружил появление рекламыIdentifier в последнем Facebook SDK (3.12). Возможно, вы можете проверить свою библиотеку на наличие с помощью метода ниже:

Я открыл FacebookSDK.framework как библиотеку в терминале и набрал следующую команду

otool -v -s __TEXT __objc_methname FacebookSDK | grep advertisingIdentifier

Но я не знаю, что делать. Было ли отклонено мое приложение из-за этой ссылки? Если да, что делать, если я хочу использовать функции facebook в своем приложении?

Ответ 8

Это немного сложнее, чем кажется на первый взгляд. После некоторых экспериментов я обнаружил, что AdSupport Framework связан даже с прямым доступом к классам, на которые ссылаются в AdSupport Framework. По иронии судьбы, [AsIdentifierManager class], который используется во многих сторонних библиотеках для проверки того, была ли привязана система AdSupport Framework, фактически приведет к привязке AdSupport Framework. Обфускание класса с помощью NSClassFromString(@"AsIdentfierManager") не приведет к автоматической привязке рамки AdSupport. Конечно, большую часть времени этот код будет в сторонних библиотеках, поэтому у вас не будет большого контроля над ним, однако, это то, что происходит.

Я построил пример проекта на GitHub, который иллюстрирует это поведение с использованием среды Segment.io. https://github.com/distefam/AdSupportDemo

Ответ 9

Flurry Analytics также использует этот API.
Выход терминала:

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

Flurry говорит, что селектор не вызывается, если структура AdSupport не связана.
Поэтому я удалил фреймворк и попытался отправить его снова.