62

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

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

4

5 回答 5

45

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

于 2016-02-26T16:56:39.857 回答
35

我认为您可以使用嵌入式框架在您的应用扩展程序及其包含的应用程序之间共享代码。但是您必须小心,您的框架不包含扩展程序无法使用的 api。请参阅某些 API 对应用程序扩展不可用使用嵌入式框架共享代码

如果您的框架不包含此类 api,请不要忘记Require Only App-Extension-Safe API框架目标的Build Settings.

在此处输入图像描述

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

在此处输入图像描述

于 2018-02-19T09:52:52.647 回答
7

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

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

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

于 2015-04-07T02:00:04.660 回答
7

我的框架没有使用任何受限制的 API,我仍然收到警告……这为我解决了。 在此处输入图像描述

于 2020-11-03T13:38:34.587 回答
2

有时'保姆'并不知道最好的。

您可以避免链接到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)而不会使链接器发疯。

如果您尝试从分机调用它,您将遇到崩溃。

于 2018-09-10T12:29:14.017 回答