审核 二进制文件被拒绝
Your app uses or references the following non-public APIs: xxx,xxx
年前上线的版本因为使用系统非公开api导致了二进制文件被拒绝没审核过,总结下如何解决问题通过审核
- 如何在项目上线前检查是否引用了系统非公开api,防止审核被拒
- 如果在万不得已的情况下使用系统非公开api,如何规避Apple的审查、通过审核
1、在项目上线前检查是否引用了系统非公开api
- 如果您正在使用第三方库,请更新到这些库的最新版本。
- 如果您没有访问库的源代码,您可以使用“字符串”或“otool”命令行工具搜索已编译的二进制文件。“strings”工具可以输出库调用的方法的列表,“otool -ov”将输出Objective-C类结构及其定义的方法。
2、使用了系统非公开api 也可以通过审核
比如项目代码[target isKindOfClass:NSClassFromString(@"CAMViewfinderView")]
,其中的CAMViewfinderView
就是系统非公开的api,Apple审核的时候检查到了这个字符就会直接把你的项目打回来并告诉你“二进制文件被拒绝”,但是我的项目里不写这个方法就会出现各种bug,怎么办?
其实只要不让项目里直接出现“CAMViewfinderView”这个字符串就不会被Apple检测到了,既不用动太多代码影响功能,也能通过审核的两种方法:
1. 动态拼接字符串
比如把“CAMViewfinderView”拆分成好几个字符串,这样调用这个方法[target isKindOfClass:NSClassFromString(str1,str2,str3,str4)]
(str1,str2,str3,str4拼起来就是CAMViewfinderView)
2. 加密处理系统非公开api
统一加密工具,在程序外先加密好你调用的api字符串
- 比如先把
“CAMViewfinderView”
加密成"Q0FNVmlld2ZpbmRlclZpZXdDb250cm9sbGVy"
- 然后在app方法里先解密
"Q0FNVmlld2ZpbmRlclZpZXdDb250cm9sbGVy"
为decodeStr
, - 再调用
[target isKindOfClass:NSClassFromString(decodeStr)]
加密的方法是亲测成功通过审核的所以总结分享下。
整个方法都没直接出现系统的非公开api,但实现的方法是没有任何变化,再提交就能审核通过
注意:还是尽量不要调用系统非公开api;如果你使用上述方法避开审核一定要写好修改注释或者文档,否则后面时间一久维护起来就相当麻烦了。