Unity3D 游戏 AppStore 审核因为 ASIdentifierManager 被拒的解决办法

上周末我们的游戏『铁血战神』提交 AppStore 审核已经快一周了还木有结果,很是着急啊。周六上午终于有消息了,只可惜不是什么好消息,我们被拒了,被拒绝的原因很简单:

“You and Your Applications (and any third party with whom you have contracted to serve advertising) may use the Advertising Identifier, and any information obtained through the use of the Advertising Identifier, only for the purpose of serving advertising. If a user resets the Advertising Identifier, then You agree not to combine, correlate, link or otherwise associate, either directly or indirectly, the prior Advertising Identifier and any derived information with the reset Advertising Identifier.”

Note: iAd does not use the AdSupport framework, ASIdentifierManager, or the Advertising Identifier. Therefore they are not required for iAd implementations and should not be included in your app for iAd support.

Please check your code – including any third-party libraries – to remove any instances of:

class: ASIdentifierManager

selector: advertisingIdentifier

framework: AdSupport.framework

就是我们的游戏中没有任何广告,同时我们也不帮其他的应用做推广,那么好吧,苹果认为我们不应该使用这个专门为广告而设定的接口(真是尼玛没有道理可以讲啊,据说是为了打击积分墙等类似的推广手段,防止刷榜等等)。

那么好吧,先把我们自己使用到 ASIdentifierManager 处的代码全部干掉,那么这样是不是就可以重新打包然后再提交呢?

貌似不是滴,咱们还是遍历查找一下整个工程的代码吧,看看还有没有别的地方调用到了这个类的某些方法,最终你会发现,Unity3D 编译出来的 iOS 工程中的部分 iOS 代码使也用到了这个接口,这部分代码在编译出来的工程下,Classes/Unity/DeviceSettings.mm 文件中。

不得不说 Unity3D 的实现还是比较好的,最起码没有包含 AdSupport.framework,没有直接引用头文件,也没有直接调用 ASIdentifierManager 这个类的 advertisingIdentifier 方法,而是通过动态的查找这个类库同时动态的找到方法再调用,不过貌似这样也木有办法绕过苹果的审核哦。最终还是会现形的,那么最终如何解决呢?

Unity3D 的官方论坛上已经有了 Unity3D 的开发人员给出的 Quick Fix 了,大家自行前往查看即可,传送门在 这里 .

大体的思路还是将使用到的代码都删掉,不过为了避免以后每次重新编译 Unity3D 项目到 Xcode 工程时,都得手动修改一次,Unity3D 的官方人员也提到最好还是一次性搞定 Unity3D 使用到的模板文件,这个文件就在/Applications/Unity/Unity.app/Contents/PlaybackEngines/iPhonePlayer/iPhone-Trampoline/Classes/下,找到 DeviceSettings.mm 文件,按照那个 Unity3D 官方的 Quick Fix 来修改,以后每次编译出来的新工程中这个文件就不需要再次手动修改了。

修改完了之后,重新打包测试提交,顺利通过审核,感谢所有 TV 啊。