我的应用因为使用了广告支持框架而被拒绝了。是哪个库导致的?

82
这只是一次更新,与拒绝理由无关。以下是解决中心的回应:

原因 程序许可协议 PLA 3.3.12

我们发现您的应用程序使用了iOS广告标识符,但没有包含广告功能。这不符合App Store审核指南所要求的iOS开发人员计划许可协议条款。

具体而言,iOS开发人员计划许可协议第3.3.12节规定:

"您及您的应用程序(以及您与之签订广告服务合同的任何第三方)仅可以为提供广告服务的目的使用广告标识符及通过广告标识符获取的任何信息。如果用户重置广告标识符,则您同意不将先前的广告标识符和任何派生信息与重置的广告标识符直接或间接地组合、关联或以其他方式相互关联。"

请检查您的代码 - 包括任何第三方库 - 以删除以下任何实例:

类:ASIdentifierManager
选择器:advertisingIdentifier
框架:AdSupport.framework

如果您计划在将来的版本中加入广告,请在包含广告功能之前从您的应用程序中删除广告标识符。

为了帮助定位广告标识符,可以使用“nm”工具。有关“nm”工具的信息,请打开终端窗口并输入“man nm”。

如果您无法访问库源代码,则可以使用“strings”或“otool”命令行工具搜索编译的二进制文件。 “strings”工具列出库调用的方法,“otool -ov”将列出Objective-C类结构及其定义的方法。这些技术可以帮助您缩小问题代码所在的范围。

我正在使用的第三方库是最新版本的parse.com sdk、最新版本的flurry分析工具以及test flight 2.2版本。有人知道哪个库存在问题吗?谢谢


10
我看到有人在使用谷歌分析时遇到了这个问题。 - jcesarmobile
我真的不知道如何执行他们建议的操作。 - user2844801
1
然而,你被标记的最大原因是TestFlight,这个ID是必不可少的:https://testflightapp.com/sdk/ios/doc/2.0.0/ - “AdSupport.framework在iOS 6.0+上是必需的,以便唯一地识别用户,以便我们可以估计您的应用程序有多少用户(使用ASIdentifierManager)。您可以在应用程序中弱链接框架。如果您的应用程序没有与AdSupport.framework链接,TestFlight SDK将自动为在iOS 6.0+上运行的应用程序加载它。” - Louis St-Amour
5
原来是Testflight v2.2.0出了问题。根据他们的变更日志,他们已经修复了这个问题:将两个SDK版本合并为一个,从而删除了对ASIdentifierManager的所有访问。 - user2844801
5
如果将AdSupport.framework连接为可选项,这样做能解决App Store的问题吗? - Legoless
显示剩余10条评论
9个回答

115

在终端中:

  1. 进入项目的根文件夹
  2. 键入:grep -r advertisingIdentifier . (最后一个点很关键)

这将递归检查每个文件,并给出有问题的库的名称。

(在我的例子中,是Flurry)


1
我也遇到了同样的问题。libFlurry_4.3.1.a和libGoogleAnalyticsServices.a两个库都包含Advertising Identifier。不知道它们何时会更新或是否有任何解决方法。 - Vidal Graupera
2
我们该怎么办?我们不能完全删除我们的分析数据... - Nir Golan
1
@LouWeed - 当这种情况发生时,您必须从您的应用程序中删除Flurry,并假设Flurry正在慌张并将很快提供新的更新。使用免费的第三方分析工具的缺点是有时会出现这样的问题。我以前也遇到了类似的问题,如Flurry、TestFlight、Facebook、Parse和其他一些工具。这种情况经常发生。但如果您没有为此付费,就不能太抱怨:) - Adam
2
可以确认,使用上述命令时,Flurry 4.3.2与advertisingIdentifier不匹配。 - crafterm
我该如何解决Facebook SDK 3.12的问题?我的应用被拒绝了。 - QCG
显示剩余8条评论

17

更新

Google发布了Google Analytics Services iOS SDK v3.03c版本,该版本默认删除了AdSupport.framework依赖。

完整的版本更改日志条目为Release Version 3.03c(2014年2月19日):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更新到Version 3.03a (February 5, 2014)

2- 然后也删除了AdSupport.framework

3- 在“Target --> Build Settings --> Other Linker Flags”下添加“-force_load\ "${PROJECT_DIR}/Source/Library/GoogleAnalyticsServicesiOS_3.03a"” (请注意,在我的项目中,GoogleAnalytics位于/Source/Library/文件夹中,您必须配置自己的文件夹路径)

但是由于我无法删除-ObjC标志,我搜索了如何在Cocoapods中使用-force_load标志,然后我找到了两个有用的链接:

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}。

因此,我的Other Linker Flags就像下面的图片一样。

Other Linker Flags

希望能对某些人有所帮助。

对我的英语表示抱歉。 =]


我仍然无法在没有AdSupport框架的情况下构建我的应用程序。我收到未定义符号ASIIdentifierManager的错误。 - andygeers
你正在使用Google Tag Manager吗?因为如果是的话,这个解决方案将无法工作。 - Glauco Neves
我不知道(标签管理器到底是做什么的?)但它是GA/标签管理器库文件的组合。 - andygeers
您也可以直接手动编辑Pods/Pods.xcconfig文件中的OTHER_LDFLAGS - Rivera
各位,我已经更新到v3.03c,但是我没有添加任何Tag文件。然而,我仍然无法在没有AdSupport框架的情况下编译。有什么想法吗?谢谢。 - user774150
显示剩余2条评论

13

对我来说,Flurry Analytics和TestFlight都是问题所在。

对于TestFlight,只需更新它即可。2.2.1版本不会引起任何问题(我使用字符串进行了检查,就像苹果建议的那样)。

对于Flurry,目前除了删除Flurry以外没有其他解决方法,并且与Lou Weed的建议相反,即使未链接AdSupport.framework,您的应用程序也将被拒绝。

以下是Flurry支持的答案:

"感谢您联系Flurry。我们最近得知,苹果拒绝了一些应用程序,认为它们在没有包含广告功能的情况下使用了广告标识符(IDFA)。请注意,除非应用程序包括AdSupport.framework以获取广告功能,否则Flurry不会收集IDFA。我们正在与苹果寻求澄清,并将在接下来的几天内向受影响的客户更新信息。"

Flurry刚刚发布了其SDK的4.3.2版本,专门解决了这个问题。


4
Crashlytics是问题的原因。由于它,我们有几个应用被拒绝了。但我已经与Crashlytics沟通,并且他们今天发布了一个新版本(2.1.6),修复了此问题。
多个库都包含AdSupport.framework,但只有在特定调用时才会使用它。Crashlytics需要检查应用是否支持广告,因此调用了该框架。这个更改实现在2.1.5版本上。
如果您正在使用Crashlytics,则最有可能是这个原因。要解决这个问题,只需重新打包你的应用程序,以便于Crashlytics可以使用这个新版本来进行修复。
来自Crashlytics团队的回应: “我们刚刚推出了针对此问题的更新 - 你可以在Mac应用开启的情况下再次构建和运行你的应用程序,以升级你的SDK。之后,一切都会很好!重提交后请通知我 :)”
PS:这开始发生,因为苹果似乎已经改变了他们对ADSupport使用的政策。

4
原来是Testflight v2.2.0版本存在冲突。根据他们的变更日志,已经修复了这个问题:将两个SDK版本合并为一个,从而删除对ASIdentifierManager的所有访问

3

我之前在评论中提到过“strings”或“otool”终端命令,让人们进行查找。然而,我真的很喜欢使用grep的建议答案。因此,您可以先尝试使用它。我的建议是在该命令前面添加“git”,因为这样速度会更快:

git grep advertisingIdentifier

如果那不起作用,那么尝试以下方法(如之前发布的):
grep -r advertisingIdentifier . 

以下是我之前在评论中写的有关终端命令的内容:
你可以在Xcode中搜索项目文件,或者尝试移除AdSupport框架以查看编译/运行时出现了什么问题。
要使用终端,请点击Spotlight(搜索)并输入Terminal。等待它出现在搜索结果中作为一个应用程序。
进入终端后,输入“cd”和一个空格,然后从Finder中拖放您的Xcode构建文件夹到终端。这应该自动输入该文件夹名称。按Enter键,它将改变目录(CD)到该文件夹。
从那里开始,输入strings,然后是库文件的文件名或otool,一个空格和库文件的文件名。您应该能够按TAB键自动完成文件名。

1

我的应用程序也因为同样的错误而被拒绝!我在最新的Facebook SDK(3.12)中发现了广告标识符(advertisingIdentifier)的出现。也许您可以使用以下方法检查库中是否有这个出现:

我在终端中将FacebookSDK.framework作为库打开,然后输入以下命令:

otool -v -s __TEXT __objc_methname FacebookSDK | grep advertisingIdentifier

但我不知道该怎么办。我的应用程序是因为这个引用而被拒绝吗?如果是,那么如果我想在我的应用程序中使用Facebook功能,该怎么办呢?


1
这里有帮助 - https://dev59.com/nWEi5IYBdhLWcg3wJpcl - Andrew
谢谢您的回答!我已经做出了更改并重新提交了我的应用程序,希望它不会再次被拒绝 :) - bolonn
@bolonn - 在进行了上述更改后,您的应用程序是否已被苹果批准? - RoHaN
是的,它已经被批准了! - bolonn

1
这比表面上看起来要复杂一些。经过一些实验,我发现即使只直接访问AdSupport Framework中引用的类,它也会被链接。具有讽刺意味的是,很多第三方库中用于检查是否已链接AdSupport Framework的[AsIdentifierManager class]实际上会导致AdSupport Framework被链接。通过使用NSClassFromString(@"AsIdentfierManager")混淆该类不会自动链接AdSupport框架。当然,大多数情况下,这段代码将在第三方库中,因此您对其没有太多控制,但这就是所发生的事情。
我在GitHub上构建了一个示例项目,使用Segment.io的框架说明了这种行为。https://github.com/distefam/AdSupportDemo

谢谢您分享有用的帖子。因此,在将框架(在我这个案例中是名为“GoogleInteractiveMediaAds”的谷歌广告框架)添加到项目中时,如果选择弱链接(可选),该框架内部会包含AdSupport.framework。当我提交我的应用程序时,即使我的应用程序不显示任何广告(还有一个付费版本根本不显示任何广告),它是否会被苹果拒绝? - C0D3

0

Flurry Analytics 也使用了这个 API。
终端输出:

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

Flurry 表示如果未链接 AdSupport 框架,则不会调用选择器。
因此,我删除了该框架并尝试重新提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接