【问题标题】:is dlopen use inside a static library in iOS allowed是否允许在 iOS 的静态库中使用 dlopen
【发布时间】:2013-07-23 15:28:53
【问题描述】:

我正在使用一个胖静态库,它使用 dlopen() 在静态库中加载内部模块(.so) 文件。在 stackoverflow 上,开发人员说 dlopen() 是一个私有 API。

在这种情况下,可以使用 dlopen() 或作为私有 API,无论库的性质如何(即静态/动态),它都不应该在用户库中使用。

如果我不能使用 dlopen() ,那么有人可以指向任何资源以获取完成相同任务的替代方法。

注意:这是关于 baresip BSD 库。 (http://www.creytiv.com/)

更新: 库首先尝试静态加载所有配置的模块,如果失败,则尝试使用 dlopen() 动态加载它们。所以删除动态加载代码将解决我的问题。

【问题讨论】:

  • Apple 不允许您在应用程序中执行动态链接。此外,任何使用未记录的方法都是拒绝的理由。
  • 我接受此作为答案,但我无权将此标记为答案。
  • 那是因为它不是一个答案。这是一条评论;)。
  • 你有没有成功链接到baresip?这是一个真正的宝石,我们将依赖它,但现在我完全被这个问题所困扰。如果是,你能分享你的解决方案吗?
  • @VictorSergienko 抱歉,我没有在登录时使用 SO,因此无法看到您的 cmets。我用 baresip 创建了一个 xcode ios 项目,去年测试时语音通话工作正常。

标签: ios static-libraries sip dlopen baresip


【解决方案1】:

dlopen 与文字参数一起使用始终没问题。

dlopen 已记录在案,因此它不是私有 API。只需在终端中输入man dlopen,或查看应用程序扩展编程指南 > Handling Common Scenarios,或动态库使用指南 >12

如果您尝试将dlopen 与您签名的代码一起使用,但未包含在所审查的应用程序中,则您侵犯了App Review Guidelines 2.5.2

2.5.2 应用程序应在其捆绑包中自包含,不得在指定容器区域之外读取或写入数据,也不得下载、安装或执行代码,包括其他应用程序。

你可能会收到这样的消息:

您的应用、扩展程序和/或链接框架似乎包含明确设计的代码,能够在应用审核批准后更改您的应用的行为或功能,这不符合 App Store 审核指南 2.5.2 和第 3.3 节.2 Apple 开发者计划许可协议。

与最初在 App Store 审核时相比,此代码与远程资源相结合,可以帮助您对应用的行为进行重大更改。虽然您目前可能没有使用此功能,但它有可能加载私有框架、私有方法并启用未来的功能更改。 这包括将任意参数传递给动态方法的任何代码,例如 dlopen()、dlsym()、respondsToSelector:、performSelector:、method_exchangeImplementations(),以及运行远程脚本以更改应用行为和/或根据下载脚本的内容调用 SPI。即使远程资源不是故意恶意的,它也很容易被中间人 (MiTM) 攻击劫持,这可能会给您的应用用户带来严重的安全漏洞。

【讨论】:

    【解决方案2】:

    dlopen 在 iOS 版本 here.

    【讨论】:

    • 我已将此标记为正确答案,尽管我在一年前从 cmets 得到了答案。
    • Apple 明确建议您在使用嵌入式框架并部署到低于 8.0 的 iOS 时使用dlopendeveloper.apple.com/library/ios/documentation/General/…
    • 苹果文档说只有在用户有条件的 ios 版本检查时才使用 dlopen(),这样如果用户有 ios 8 及更新版本,他/她可以调用 dlopen 来打开框架包 ... 使用 dlopen( ) 到 8.0 之前的 ios 仍然不推荐
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2023-03-30
    • 2015-11-15
    相关资源
    最近更新 更多