Мое приложение было отклонено за использование платформы поддержки рекламы. Какая библиотека отвечает?

81

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

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

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

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

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

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

Класс: ASIdentifierManager
селектор: advertisingIdentifier
рамки: AdSupport.framework

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

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

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

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

user2844801
источник
ИМО, они дали много подсказок, чтобы выполнить этот поиск самостоятельно ... вы пытались, но не нашли?
Адриано Репетти
10
Я видел людей, у которых была эта проблема с Google
Analytics
1
Однако самая большая причина, по которой вас помечают, - это TestFlight, для которого необходим этот идентификатор: testflightapp.com/sdk/ios/doc/2.0.0 - «AdSupport.framework требуется для iOS 6.0+, чтобы однозначно идентифицировать пользователей, чтобы мы могли оценить количество пользователей вашего приложения (с помощью ASIdentifierManager). У вас может быть слабая связь с фреймворком в вашем приложении. Если ваше приложение не связано с AdSupport.framework, TestFlight SDK автоматически загрузит его для приложений, работающих на iOS 6.0+ ».
Луи Сент-Амур,
5
Оказалось, что Testflight v2.2.0 был конфликтом. С тех пор они исправили это в соответствии с их журналом изменений: объединить обе версии SDK в одну, которая удаляет весь доступ к ASIdentifierManager
user2844801
5
Если AdSupport.framework связан как необязательный, решит ли это проблему с App Store?
Legoless

Ответы:

114

В Терминале:

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

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

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

Адам
источник
1
Меня тоже поразило то же самое. У libFlurry_4.3.1.a и libGoogleAnalyticsServices.a есть AdvertisingIdentifier. Не знаю, когда они будут обновлены или есть ли какое-то решение.
Видал Граупера
2
что мы делаем с этим? мы не можем просто удалить нашу аналитику полностью ...
Нир Голан
@RedYeti - спасибо, что исправили мою опечатку! Извините за это - ошибка копирования / вставки :(.
Адам
1
@LouWeed - когда это произойдет, вы должны удалить Flurry из своих приложений и предположить, что Flurry паникует и ОЧЕНЬ скоро предоставит новое обновление. Обратной стороной использования бесплатной сторонней аналитики является то, что иногда они так ошибаются. У меня было подобное с Flurry, TestFlight, Facebook, Parse и некоторыми другими в прошлом. Бывает. Но если вы не платите за услугу, вы не можете сильно жаловаться :)
Адам
2
Можно подтвердить, что Flurry 4.3.2 не совпадает с AdvertisingIdentifier, используя указанную выше команду.
crafterm
17

Обновить

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

Полная запись в журнале изменений версии 3.03c (19 февраля 2014 г.): https://developers.google.com/analytics/devguides/collection/ios/changelog

Old Awnser

Моя проблема была в 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 "" в "Target -> Build Settings -> Other Linker Flags" (обратите внимание, что в моем проекте GoogleAnalytics находится внутри / Source / Библиотека / папка, а надо настроить свою)

Но поскольку я не мог удалить флаг -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 -> Build Settings -> Other Linker Flags»

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

Итак, мои другие флаги компоновщика стали такими, как на изображении ниже. Другие флаги компоновщика

Надеюсь помочь кому-нибудь.

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

Глауко Невес
источник
Я по-прежнему не могу создать свое приложение без платформы AdSupport. Я получаю неопределенный символ ASIIdentifierManager
Andygeers
Вы используете Диспетчер тегов Google? Потому что, если да, то это решение не сработает.
Глауко Невес,
Не то, чтобы я знал (что вообще делает Диспетчер тегов?) Это объединенный файл библиотеки GA / Диспетчера тегов
andygeers
Вы также можете вручную редактировать файлы Pods / Pods.xcconfig OTHER_LDFLAGSнапрямую.
Rivera
Сегодня Google выпустила SDK Google Analytics Services для iOS v3.03c. Я обновил свой ответ. =]
Глауко Невес
13

Для меня проблемой были и 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, которая специально решает эту проблему.

Fradow
источник
4

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

user2844801
источник
4

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

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

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

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

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

gmogames
источник
3

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

git grep advertisingIdentifier

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

grep -r advertisingIdentifier . 

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

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

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

Оказавшись в Терминале, введите «cd», а затем пробел, затем перетащите папку сборки Xcode из Finder в Терминал. Это должно автоматически ввести это имя папки. Нажмите Enter, и он изменит каталоги (cd) на эту папку.

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

Луи Сент-Амур
источник
1

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

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

otool -v -s __TEXT __objc_methname FacebookSDK | grep AdvertisingIdentifier

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

Болонн
источник
1
Здесь это должно помочь - stackoverflow.com/questions/21574680/…
Эндрю
Спасибо за ответ! Я внес изменения и повторно отправил свое приложение, надеюсь, оно больше не будет отклонено :)
bolonn
@bolonn - было ли ваше приложение одобрено Apple после внесения вышеуказанных изменений?
RoHaN
Да, одобрили!
bolonn
1

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

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

Майкл ДиСтефано
источник
Спасибо за полезный пост. Поэтому, когда мы слабо связываем (необязательно) фреймворк с проектом (в моем случае это рекламный фреймворк Google под названием "GoogleInteractiveMediaAds"), в котором есть AdSupport.framework, когда я отправляю свое приложение, даже если мое приложение не показывает никаких реклама (есть платная версия, в которой вообще не отображается реклама), будет ли она отклонена Apple ??
C0D3
0

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

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

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

Нир Голан
источник