我的应用程序因使用广告支持框架而被拒绝。哪个图书馆负责?

时间:2014-01-31 20:07:18

标签: ios parse-platform appstore-approval flurry testflight

这只是一个更新,并没有改变任何与拒绝原因有关的事情。以下是决议中心的回复:

  

原因   程序许可协议   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, latest version of flurry analytics, and version 2.2 of test flight的最新版本。有谁知道哪个库是问题?感谢

9 个答案:

答案 0 :(得分:112)

在终点站:

  1. 转到项目的根文件夹
  2. 输入:grep -r advertisingIdentifier . (最后的点是关键)
  3. 这将递归检查每个文件,并为您提供有问题的库的名称。

    (在我的情况下,它是Flurry)

答案 1 :(得分:17)

<强>更新

Google发布了Google Analytics Services iOS SDK v3.03c,默认情况下会删除AdSupport.framework依赖项。

发布版本3.03c的完整更新日志条目(2014年2月19日):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版(2014年2月5日)

2 - 然后删除了AdSupport.framework

3 - 在“目标 - &gt;构建设置 - &gt;其他链接标志”下添加了“-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/

总结一下,我在“目标 - &gt;构建设置 - &gt;其他链接器标志”下更改了“-force_load $(TARGET_BUILD_DIR)/libPods.a”的-ObjC标志

但是,当我尝试发布我的应用程序时,我收到一个错误,告诉我编译器没有找到libPods.a,所以我去了“Target - &gt; Build Settings - &gt; Other Linker Flags - - &gt;发布“并将此字符串$(TARGET_BUILD_DIR)更改为$ {BUILT_PRODUCTS_DIR}。

所以我的其他链接器标志变得如下图所示。 Other Linker Flags

希望能帮到别人。

抱歉我的英文。 =]

答案 2 :(得分:13)

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

对于TestFlight,它就像更新它一样简单。 2.2.1版本不会引起任何问题(我使用字符串检查,如Apple建议的那样)

对于Flurry,目前除了删除Flurry之外没有任何修复,与Lou Weed建议相反,即使AdSupport.framework没有链接,您的应用也会被拒绝。

<罢工>

这是Flurry的支持回答:

“感谢您与Flurry联系。我们最近了解到Apple拒绝了一些其认为正在使用广告标识符(IDFA)而不包含广告功能的应用。请注意,Flurry确实除非应用程序包含广告功能的AdSupport.framework,否则不会收集IDFA。我们正在寻求与Apple的澄清,我们会在接下来的几天了解更多信息后更新受影响的客户。“

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

答案 3 :(得分:4)

原来,Testflight v2.2.0发生了冲突。他们已经根据他们的更改日志修复了它:Consolidate both SDK versions into one which removes all access to ASIdentifierManager

答案 4 :(得分:4)

Crashlytics是问题所在。我们因为它而拒绝了一些应用程序。但我已经与Crashlytics进行了交谈,他们今天发布了一个新版本(版本2.1.6)来解决这个问题。

有几个库具有AdSupport.framework,但除非特别调用,否则它们不会使用它。 Crashlytics正在调用框架,因为它必须检查应用程序是否支持广告。并且该更改已在2.1.5版本上实施

因此,如果您使用的是崩解剂,那么这是最可能的原因。要解决此问题,只需重新归档您的应用,以便崩解剂可以使用此版本的新版本。

Crashlytics团队的回应: “我们刚推出了一个更新版本 - 你可以在Mac应用程序打开的情况下再次构建和运行你的应用程序,这样它就可以更新你的SDK吗?你会很高兴去那之后!在你重新提交后让我发布:)”

PS:这已经开始发生,因为Apple似乎已经改变了他们的ADSupport使用政策。

答案 5 :(得分:3)

我之前在评论中写了以下内容,将人们引导到&#34;字符串&#34;或&#34; otool&#34;终端命令。但是,我真的很喜欢使用grep的建议答案。所以你可以先试试。我的建议是先加上&#34; git&#34;对那个命令,因为它的速度要快得多:

git grep advertisingIdentifier

如果这不起作用,那么试试(如前面所述):

grep -r advertisingIdentifier . 

以下是我之前在上述评论中所写的内容,作为终端命令的操作方法:

您可以在Xcode中搜索项目的文件,或者您可以尝试删除AdSupport框架,以查看在构建/运行时失败的内容。

要使用终端,请单击Spotlight(搜索)并键入终端。等待它在搜索结果中显示为应用程序。

进入终端后,输入&#34; cd&#34;然后是空格,然后将Xcode构建文件夹从Finder拖放到终端。这应该自动键入该文件夹名称。按Enter键,它会将目录(cd)更改为该文件夹。

从那里输入strings然后输入空格,然后输入库的文件名或otool,空格和库的文件名。您应该能够点击TAB以自动完成文件名。

答案 6 :(得分:1)

我的应用也因同样的错误被拒绝了!我在最新的Facebook SDK(3.12)中发现了adsIdentifier。也许您可以使用以下方法检查您的图书馆是否出现:

我在终端中打开了FacebookSDK.framework作为库,并输入以下命令

otool -v -s __TEXT __objc_methname FacebookSDK | grep advertisingIdentifier

但我不知道该怎么做。我的应用程序因为此引用而被拒绝了吗?如果我想在我的应用程序中使用facebook功能,该怎么办?

答案 7 :(得分:1)

这比表面看起来要复杂一些。经过一些实验,我发现即使只是直接访问AdSupport Framework中引用的类,也会链接AdSupport Framework。具有讽刺意味的是,[AsIdentifierManager class]在许多第三方库中用于检查AdSupport Framework是否已被链接,实际上会导致链接AdSupport Framework。使用NSClassFromString(@"AsIdentfierManager")对类进行模糊处理不会导致AdSupport框架自动链接。当然,大多数情况下,这段代码将出现在第三方库中,因此您无法控制它,但是,这就是正在进行的。

我在GitHub上构建了一个示例项目,它使用Segment.io的框架来说明这种行为。 https://github.com/distefam/AdSupportDemo

答案 8 :(得分:0)

Flurry Analytics也使用此API 终端输出:

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

Flurry说如果未链接AdSupport框架,则不会调用选择器 所以我删除了框架并尝试再次提交。