应用程序中的非公共 API,__strlcat_chk,__strlcpy_chk
Posted
技术标签:
【中文标题】应用程序中的非公共 API,__strlcat_chk,__strlcpy_chk【英文标题】:non-public API in App, __strlcat_chk, __strlcpy_chk 【发布时间】:2013-09-15 03:49:13 【问题描述】:在我的 iphone 应用程序 (ios7) 提交过程中,我看到了屏幕上显示的错误。基本上,它说我使用了非公共符号__strlcat_chk,strlcpy_chk,我知道strlcat和strlcpy,但不要认为它可能是非公共的。 我用的是 Xcode 5。
我也在我的项目中快速搜索了strlcat()和strlcpy(),没看到我用过。
知道可能是什么原因。
[更新] 在通过我的开发者帐户提交票证后,我实际上从 Apple 获得了更新(我们都有 2 个技术支持与开发者帐户一起提供。)基本上,Apple 支持告诉我这是已知问题。告诉苹果您的应用名称和 ID 号,您的应用将被列入白名单。一旦 Apple 发出 Go 信号,提交验证过程就没有问题。
【问题讨论】:
我遇到了同样的问题。我已就此向 Apple 发送电子邮件,但目前尚未回复。 顺便问一下,您使用的是使用 OpenSSL 的库吗? 我刚刚尝试验证我的 iOS 7 应用程序,我也遇到了这个问题。我正在使用依赖于 OpenSSL 的 SQLCipher。会不会是这个问题? @TapForms SQLCipher 使用 strlcat 和 strlcpy,请查看我的答案以了解更多详细信息,我认为 SQLCipher 没有做任何苹果不赞成的事情,看来苹果需要修复它的 iOS 7 SDK,因此它不会将这些方法调用标记为“私有 API” 我通过使用 -DSQLCIPHER_CRYPTO_CC 编译 SQLCipher 解决了这个问题,它告诉它使用 Apple 的 CommonCrypto 库而不是 OpenSSL。好处是它编译得更快(不是以前很慢),而且显然还受益于加密代码的硬件加速(根据 SQLCipher 开发人员的说法)。 【参考方案1】:可以在文件中找到原因:
iOS 7.0/usr/include/secure/_string.h
导致问题的代码在这里:
#if __has_builtin(__builtin___strlcat_chk) && __HAS_FIXED_CHK_PROTOTYPES
#undef strlcat
#define strlcat(dest, src, len) \
__builtin___strlcat_chk (dest, src, len, __darwin_obsz (dest))
#endif
#endif /* __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 || __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 /
#endif / __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
我不确定这是做什么的,但我猜这就是验证代码时发现的问题。
您可以将其与 iOS 6 版本的同一个 _string.h 文件进行比较,您会发现没有对 strlcat 和 strlcpy 这两个方法的引用。
还有一个带有 rdar 参考的评论:
rdar://problem/12622659
底线:这似乎是 iOS 7.0 SDK 的一个问题,由 Apple 来“修复”它。
更新:
如果你真的想提交你的应用,只需编辑_string.h文件,将#define __HAS_FIXED_CHK_PROTOTYPES 1
编辑为#define __HAS_FIXED_CHK_PROTOTYPES 0
【讨论】:
苹果对此有何更新?我和作者有同样的问题。我正在尝试使用 -DSQLCIPHER_CRYPTO_CC 标志,但这意味着所有以前加密的数据都将在用户设备上丢失... @Klu - 您可以尝试在 _string.h 中将#define __HAS_FIXED_CHK_PROTOTYPES 1
翻转为 #define __HAS_FIXED_CHK_PROTOTYPES 0
,以提交应用程序。
在通过我的开发者帐户提交票证后,我实际上从 Apple 获得了更新(我们都有 2 个技术支持与开发者帐户一起提供。)基本上,Apple 支持告诉我这是已知问题。告诉苹果您的应用名称和 ID 号,您的应用将被列入白名单。一旦 Apple 发出 Go 信号,提交验证过程就没有问题。
我导出了CFLAGS=-DMAC_OS_X_VERSION_MIN_REQUIRED=1060
以使其工作。我在链接到不是这样编译的 sqlite 时遇到了问题。【参考方案2】:
我在使用自编译版本的 OpenSSL 时遇到了这个问题。我针对 iOS 6.1 SDK 重新编译了 OpenSSL,将 libssl.a 和 libcrypto.a 添加到我的项目中,然后针对 SDK 7.0 构建/归档了我的应用程序,现在它已通过验证。
因此,这似乎是 iOS 7.0 SDK 的问题,但如果您仍然可以访问 6.1 SDK,则此解决方法应该可行。
【讨论】:
以上是关于应用程序中的非公共 API,__strlcat_chk,__strlcpy_chk的主要内容,如果未能解决你的问题,请参考以下文章
ITMS-90338:非公共 API 使用 - 应用程序引用非公共选择器 _setAlwaysRunsAtForegroundPriority:
Instagram 公共 API (/?__a=1) 有效,但仅在某些时候有效