【问题标题】:How to suppress `warning: linking against dylib not safe for use in application extensions`?如何抑制“警告:链接到 dylib 对在应用程序扩展中使用不安全”?
【发布时间】:2015-02-21 22:24:38
【问题描述】:

我有一个在 iOS 应用程序和扩展程序之间共享的动态框架。该框架中有一些引用UIApplication 的代码,当然不能在扩展中使用。这些电话是完全隔离的,所以我不担心它们会导致我的分机出现问题。

由于警告消息中没有指定标志,也许没有办法做到这一点,但是我在构建我的项目时如何抑制 warning: linking against dylib not safe for use in application extensions

【问题讨论】:

  • 在您的扩展目标中,“构建选项”部分中有一个构建设置 - “仅需要应用程序扩展安全 API”。如果尚未启用,请尝试启用它...
  • 哦,顺便说一句 - 即使在你的扩展程序中不使用不允许的 api 一切都运行良好,苹果很有可能会拒绝你的扩展程序链接它。请参阅应用扩展编程指南中的“处理常见场景”部分。
  • @Toastor 禁用Require Only App-Extension-Safe API 解决了这个问题!
  • 这对我没有帮助:(
  • 就我而言,这仅仅是因为我没有在我的扩展使用的库中添加特定的框架。这样做了,问题就消失了。

标签: ios ios-frameworks linker-warning ios-extensions


【解决方案1】:

对于您的 watch/today-widget 扩展目标(而不是您的应用或 libray 目标),进入项目设置并将构建设置 APPLICATION_EXTENSION_API_ONLY / Require Only App-Extension-Safe API 更改为 NO

【讨论】:

  • 这只会关闭警告。任何对 Extension 不可用的 API 的使用都将导致 Apple 应用审核期间被拒绝。如果您打算通过 App Store 发布此应用,最好保持警告打开状态,并删除任何不允许用于扩展的 API。
  • 这是正确答案。我刚刚摆脱了 20 多个警告,非常感谢! @skim 仅供参考,使用 API“不可用”扩展不会导致拒绝。多年来,我一直使用扩展程序中的 UIApplication.openURL 打开容器应用程序,它们不仅始终按预期工作,而且从未导致任何 App Store Review 拒绝。
  • 优秀的答案!整个上午都在试图弄清楚为什么在使用@testable import MyApp 时无法在我的测试中使用EventKitUI。将开关拨至No 即可使用。
  • 从 XCode 12.5 开始,它会强制你将 Require Only App-Extension-Safe API 设置为 YES
  • 这是一种危险的方法,因为它不检查非安全 API 的使用,因此不会检查 App Store 拒绝。您可以通过在 Framework 目标上将 Require Only App-Extension-Safe API 设置为 YES 来删除警告维护 Xcode 检查。
【解决方案2】:

我认为您可以使用嵌入式框架在您的应用扩展程序及其包含的应用程序之间共享代码。但是您必须小心,您的框架不包含扩展程序无法使用的 api。请参阅Some APIs Are Unavailable to App ExtensionsUsing an Embedded Framework to Share Code

如果您的框架不包含此类 API,请不要忘记在您的框架目标的 Build Settings 中将 Require Only App-Extension-Safe API 设置为 YES

作为在应用程序和扩展程序之间共享源文件的第二种方式,您不必创建单独的框架目标。您可以通过同时定位两个项目来共享源文件。

【讨论】:

  • 这实际上比为 Widget 目标设置 NO 更有意义。将框架限制为对扩展友好是正确的方法。
【解决方案3】:

简短的回答:没有真正的办法。

我最终做的是重构我的代码,以提取我的扩展和动态框架共有的部分,以便我的扩展可以安全地引用这些部分,而独立于电话特定的代码。

我最终这样做是因为将来某个时候我需要将其提交到 App Store,而 Apple 的指导方针似乎很清楚,引用 UIApplication 是一个非常大的禁忌。

【讨论】:

  • 你把通用代码放在哪里了?我们将它放在一个框架中,并在应用程序和扩展中引用它。但这引发了警告......
【解决方案4】:

我的框架没有使用任何受限制的 API,我仍然收到警告...这为我解决了问题。

【讨论】:

  • 这是正确答案。
【解决方案5】:

有时“保姆”并不知道最好的情况。

您可以避免链接到UIApplication.shared,而只需在您的框架中动态调用这些方法。

class Application {
    static var shared: UIApplication {
        let sharedSelector = NSSelectorFromString("sharedApplication")
        guard UIApplication.responds(to: sharedSelector) else {
            fatalError("[Extensions cannot access Application]")
        }

        let shared = UIApplication.perform(sharedSelector)
        return shared?.takeUnretainedValue() as! UIApplication
    }
}

这使您可以有效地调用UIApplication.shared(只需调用Application.Shared)而不会使链接器崩溃。

如果您尝试从扩展程序调用它,您将会崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多