ITMS-90338非公开API报错:仅改构建号的已上线包提交被拒
ITMS-90338: Non-public API usage 排查解决方案(iOS 16 提交场景)
这个报错确实和iOS 16发布后App Store Connect的静态扫描规则更新直接相关,不是你代码改动导致的问题——iOS大版本迭代后的1-2周内,苹果会更新私有API匹配规则库,大量和线上已过审版本完全一致的二进制提交时,都会因为命中新的匹配规则被打回,属于非常普遍的情况。
你收到的邮件里列出的选择器,大部分和WKWebView、JS交互逻辑相关,苹果的扫描逻辑是全二进制匹配OC选择器明文字符串,不会校验你调用的是苹果私有API还是自定义类的同名方法,只要字符串完全匹配就会触发标记,排查不需要逐行翻源码,按下面的步骤走即可:
第一步:全量扫描二进制内的匹配符号
打开终端进入工程根目录,执行以下命令扫描所有源码、静态库、动态库中命中规则的符号,比手动搜索源码准确率高很多:
grep -r "callWithArguments\|estimatedProgress\|frameInfo\|getVersion\|initWithFrame:configuration:\|isMainFrame\|navigationDelegate\|navigationType\|setNavigationDelegate:\|setProcessPool:\|targetFrame\|toDouble\|toString\|userContentController" ./
根据扫描结果对应处理:
- 如果命中的是你自己源码里的自定义方法:比如你自己写的模型类
toString转字符串方法、JSBridge层的callWithArguments:方法,直接给方法名加你项目的专属前缀(比如appx_toString),避免和规则库的名称重合即可 - 如果命中的是第三方SDK/静态库里的符号:优先升级到SDK方最新的适配版本,要是SDK已经停止维护,就手动替换静态库内的对应选择器字符串重新打包,不要保留原方法名
- 重点注意JS交互类、WebView容器类、热更新类SDK,这类SDK是触发该报错的重灾区,哪怕你没主动调用相关方法,只要SDK二进制里包含对应选择器字符串就会被标记
第二步:排除构建环境差异问题
哪怕你没改业务代码,也要确认本次打包的依赖和上一个过审版本完全一致:
- 检查CocoaPods、Carthage、SPM管理的第三方依赖版本,确认没有静默升级的情况
- 检查Xcode版本,iOS 16要求用Xcode 14打包,不同Xcode版本自带的系统库链接逻辑有差异,偶尔也会带入额外的符号标记
特殊场景处理
如果你扫描后确认所有命中的选择器都是调用系统WKWebView的公开属性/方法,没有自定义同名方法、没有第三方SDK带入的符号:直接在审核申诉通道说明情况,明确标注对应方法属于WKWebView公开API,不需要修改代码,一般1-2个工作日就会审核通过。
不要尝试用字符串拼接、反射混淆的方式绕过扫描,这类操作现在会被规则识别为恶意规避审核,会触发更严格的复审。
内容的提问来源于stack exchange,提问作者Reanimation
相关产品推荐
相关产品推荐

