应用程序被拒绝,但我没有使用UDID

45

今天我们收到了有关我们提交的反馈,但我们不理解报告的问题:“应用程序不允许访问UDID,并且不得使用UIDevice的uniqueIdentifier方法。请更新您的应用程序和服务器以将用户与iOS 6中引入的供应商或广告标识符相关联。”。

我们知道UDID的拒绝情况,但我们的应用程序没有使用它!阅读后,我们的团队重新评估了该应用程序,我们没有发现任何来自“UIDevice uniqueIdentifier”的出现。我们还审查了所有使用的库,真的没有找到任何来自UDID的调用。

有人有想法吗?

经过研究,我执行了“greap”命令,并怀疑是FacebookSDK:

my-app-directory $ grep -Rnis 'uniqueIdentifier' *
Binary file MyApp/FacebookSDK.framework/FacebookSDK matches
Binary file MyApp/FacebookSDK.framework/Versions/A/FacebookSDK matches
Binary file MyApp/FacebookSDK.framework/Versions/Current/FacebookSDK matches
Binary file MyApp/MyApp.xcodeproj/project.xcworkspace/xcuserdata/myuser.xcuserdatad/UserInterfaceState.xcuserstate matches

FacebookSDK使用uniqueIdentifier?解决方案是什么?


6
你是否在使用可能包含设备唯一标识符(UDID)的第三方库或类? - sangony
你是否从你的应用程序向服务器传递任何东西,可能是你正在构建的东西,以识别iPhone? - GoZoner
1
也许一些分析库? - Undo
1
你的应用程序中是否有另外一种名为 uniqueIdentifier 的方法?有时,即使选择器不在苹果类上,苹果也会错误地标记私有/弃用选择器的使用。 - Mike Weller
这个答案可能会对你有所帮助:https://dev59.com/YWYq5IYBdhLWcg3weQky#14448057。 - JohnK
14个回答

86

在我的情况下,是ibGoogleAnalytics_debug.a库。

要找出哪个库在使用uniqueidentifier方法,请进入您的项目文件夹并键入以下内容:

$ find . | grep -v .svn  | grep "\.a" | grep -v "\.app" | xargs grep uniqueIdentifier

我收到了这个: 二进制文件./My_Project/libGoogleAnalytics_debug.a匹配


2
这应该是被接受的答案,它能够直击并准确指出有问题的代码。 - MobileVet
有没有可能出现误报?即使官方声称不再使用,Millennial SDK(v5.0.1)仍然被抛弃了。 - Emanuel
2
一些第三方库不使用“.a”扩展名,而是不使用扩展名。此命令还将在这些文件中查找API使用情况: grep -lr“uniqueIdentifier”* | grep -v .svn | grep -v .md - CornPuff
完美!必须将其保留为样本。 - SONIC3D

7
解决方法: 问题在于您的项目仍然引用旧的SDK,并使用旧的SDK方法编译代码,包括苹果拒绝的UDID。
在搜索路径的构建属性中进行修复 框架搜索路径 库搜索路径
删除不必要的值,如旧的SDK路径,并将当前SDK路径放置在那里。
清除所有项目文件: 窗口->组织者->项目 - 删除您的项目 产品->清理
现在重新构建并重新提交给苹果。
享受 :)

5

使用strings命令检查您生成的二进制文件,并查找uniqueIdentifier

$ strings YOUR_BINARY | grep uniqueIdentifier

你很可能会在里面找到它。

我发现OpenSSL的头文件中声明了一个字符串uniqueIdentifier,因此你的应用程序(或任何你提供给应用程序的静态库)很可能已经包含了它。

在我的情况下,罪魁祸首是libspotify


我该如何使用String命令?我有一个xyz.app,然后呢?我正在使用$ strings xyz.app | grep uniqueIdentifier并且得到“can't map file: xyz.app (Invalid argument)”错误。谢谢。 - Mangesh
在“.app”目录中搜索与您的应用程序同名的文件。假设我的应用程序名为“Foo.app”,则运行“find Foo.app -type f -name Foo”,然后对其运行字符串。 - Igor
@Igor - 我好像也遇到了libspotify的同样问题。它在我的源代码中没有以明文形式出现,因此似乎是在libspotify二进制文件中。你找到解决方法了吗? - Grav
@Grav - 给苹果发送一封电子邮件,说明您没有使用uniqueIdentifier,而是使用链接到OpenSSL的libspotify,该库已定义了该字符串。 - Igor
谢谢Igor,但我仍然无法运行。我在桌面上有xyz.app文件,但它无法工作:( - Mangesh
在openSSL中的uniqueIdentifier是一个类似于#define _name "uniqueIdentifier"的预处理器,因此它不会被编译到符号表中,以便苹果在编译二进制文件后进行grep。 - mskw

3

我已经向Facebook提交了一个错误报告,但是这里有一个解决方法:

https://developers.facebook.com/bugs/193119420841692

在sdk中,编辑facebook-ios-sdk/src/FBSession.m文件。

注释掉

- (BOOL)isMultitaskingSupported {
/*
UIDevice *device = [UIDevice currentDevice];
return [device respondsToSelector:@selector(isMultitaskingSupported)] &&
[device isMultitaskingSupported];*/
return TRUE;
}

自iOS 4.0起,这已不再需要。

这会删除该引用,并重新构建 .a 文件。


3

在我的情况下,这个问题是由BugSense SDK(我使用的是过时的版本)负责的。升级到最新版本(3.1.3)后,一切都正常了。


感谢Tomasz的澄清。实际上,插件的最新版本是3.3.1。您可以在此处下载并阅读发布说明:http://www.bugsense.com/releases/ios/3.3.1 - PanosJee

3

2

今天我也遇到了同样的问题。我将AdMob SDK升级到6.4.1并重新提交,但没有用。但是当我禁用AdMob代码且不链接其库后,它通过了上传检查。

根据Google的公告,AdMob SDK 6.4及以上版本不再访问UDID。显然,苹果公司并不这样认为。


升级AdMob SDK对我解决了问题。我认为你可能有另一个第三方库使用了uniqueIdentifier。 - ant_one
我今天提交了之前被拒绝的同一个二进制文件,但这次没有被拒绝。我猜问题出在iTunes Connect方面,而不是Admob库方面。 - hectr
我提交了一个新版本,使用了相同的AdMob SDK,但iTunes Connect没有抱怨。我认为问题出在iTunes Connect上,他们已经像其他人说的那样修复了它。 - Suyuan Chang

2

通常用于分析和测试的第三方库使用uniqueIdentifier来跟踪用户(例如test flight或旧版本的GA),请检查您正在使用的任何第三方库是否使用此功能。如果不是这种情况,您可以在http://itunesconnect.apple.com上请求澄清。


1
我整天都在尝试,但我的应用程序一直被拒绝。
首先,我尝试在项目文件夹中使用“find . | grep -v .svn | grep ".a" | grep -v ".app" | xargs grep uniqueIdentifier”命令进行搜索。
结果显示Google Analytics、AdMob和Wikitude SDK都在使用uniqueIdentifier。因此,我删除了GA,并更新了AdMob和Wikitude。现在,不再调用uniqueIdentifier方法。当我执行grep时,结果为空。我清理了项目中的所有内容,但我的应用程序仍然被拒绝!
现在我该怎么办?任何帮助都将不胜感激...
编辑:我找到了这行代码:
IDEWorkspaceWindowController***UniqueIdentifier***_IDEActiveWorkspaceTabController_IDE

在这个文件中:

MYPROJECT.xcodeproj/project.xcworkspace/xcuserdata/MYUSERNAME.xcuserdatad/UserInterfaceState.xcuserstate

你认为问题可能来自这一行吗?


1
这就是苹果所做的一切,你需要做的只有:
strings - -a -arch armv7 "App.app/App" | grep uniqueIdentifier

在解压App.ipa后,App.app将位于payload目录中。

只需在payload目录中运行该命令。您可以通过查找已知的方法进行测试。

如果要搜索构建的所有架构,可以将armv7替换为all


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