如何抑制`警告:链接对dylib不安全,无法在应用程序扩展中使用?

时间:2015-02-21 22:24:38

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

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

由于警告消息中没有指定标记,可能没有办法,但在构建项目时如何禁止 warning: linking against dylib not safe for use in application extensions

6 个答案:

答案 0 :(得分:29)

对于watch / today-widget扩展目标(所以不是你的app或libray目标),进入项目设置并更改构建设置" APPLICATION_EXTENSION_API_ONLY" /"仅需要App-Extension-Safe API"没有。

答案 1 :(得分:7)

简短回答:目前还没有办法。

我最终做的是重构我的代码以提取我的扩展和我的动态框架中常见的部分,以便我的扩展可以安全地引用那些独立于手机特定代码的部分。

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

答案 2 :(得分:7)

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

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

enter image description here

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

enter image description here

答案 3 :(得分:1)

有时候“保姆”最不了解。

您可以避免链接到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)而不会使链接程序异常。

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

答案 4 :(得分:0)

我的框架没有使用任何受限制的API,但我仍然收到警告...这已为我解决了。 enter image description here

答案 5 :(得分:-1)

请不要在您的项目设置中对此进行设置,因为Quick(和Nimble)已通过以下更新解决了此问题:https://github.com/Quick/Quick/releases/tag/v1.3.1(和https://github.com/Quick/Nimble/releases/tag/v7.1.3)!

只需将两个依赖项都更新到最新版本,警告就会消失。