ios - 符号进入最终二进制文件,但我在任何中间文件中都找不到它
问题描述
我有一个 iOS 应用程序。最近我开始收到来自应用商店连接的拒绝:
Non-public API usage:
The app references non-public symbols in CDDA: _locale_charset
当我尝试搜索我的中间体时:
grep -Rnisl '_locale_charset' /Volumes/XCode/DerivedData/CDDA-bgaxuifnbdpkrgfkjomdlvclkyjw/Build/Intermediates.noindex
我得到:
/Volumes/XCode/DerivedData/CDDA-bgaxuifnbdpkrgfkjomdlvclkyjw/Build/Intermediates.noindex/CDDA.build/Release-iphoneos/CDDA.build/Objects-normal/arm64/Binary/CDDA
/Volumes/XCode/DerivedData/CDDA-bgaxuifnbdpkrgfkjomdlvclkyjw/Build/Intermediates.noindex/CDDA.build/Release-iphoneos/CDDA.build/Objects-normal/armv7/Binary/CDDA
所以看起来这个符号在目标文件中没有出现。它仍然呈现。一件有趣的事情是它没有出现在调试版本中。
对我来说更奇怪的是,当我刚刚构建最后一次可以连接应用商店的 Release 配置时,该符号将在二进制文件中。但是,如果我使用相同的提交执行存档操作,那么提交将顺利进行,并且该符号将仅出现在 DSYM 文件中。
它在这次提交之后开始发生——这是最后一次成功交付到应用商店连接。下一个交付的是这个,由于使用了私有 API,它未能通过。
应用程序代码在这里。
我能做些什么来找出这个符号是如何进入二进制文件的?
升级版:
好的,看起来我有一些提示:
$ nm ./Binaries/glib/lib/libintl.a | grep _locale_charset
no symbols
no symbols
no symbols
no symbols
U _locale_charset
0000000000000000 T _locale_charset
所以我在回购中有一个二进制文件,看起来它有那个符号。但由于它一直存在,我仍然不明白为什么它会出现在最终版本中,并且该应用程序被 Apple 拒绝。那东西会出什么问题?
我发现的另一件事是,如果我SSZipArchive
从构建中删除 pod,一切都会很好。所以我找到了原因,但仍然无法理解为什么会发生这种情况。SSZipArchive 不使用或不提供该符号,这怎么可能?
UPD2:好的,我已经设法用 Zip 快速存档器替换了 SSZipArchive,所以问题就解决了。但是,我仍然对它首先发生的原因有 0 个想法。如果有人可以帮助我找到真相,那可以帮助我(可能还有其他在同样问题上苦苦挣扎的人)。
解决方案
推荐阅读
- python - pyautogui.moveTo() 在 Windows 中不起作用
- javascript - 使用 JSON 避免因为 case 太多而使用 switch case
- ios - SwiftUI 视图不会扩展到全高 - iOS 15 Xcode 13 beta 5
- amazon-web-services - Github Actions 恢复/销毁由 Terraform Plan 创建的 terraform AWS 基础设施
- javascript - 在 vuejs 上尝试 tensorflow/teachable 机器但卡在错误中
- javascript - 了解如何在 React 中正确实现多步骤表单
- c# - 为什么我在 IIS 中从谷歌返回的 json 上收到循环引用错误
- javascript - 比较两个嵌套对象数组并在javascript中比较的值不相同时返回新的对象数组
- c - strtok 是如何工作的?
- karate - 通过传入参数重用其他功能文件中的空手道测试