如何在 Swift Package Manager (SPM) 目标上设置 APPLICATION_EXTENSION_API_ONLY?

4

上下文:

  • 我们有一个Xcode项目,可以构建iOS应用程序和一些应用程序扩展。
  • 我们还在Xcode框架中拥有一些共享代码,这些代码具有标志APPLICATION_EXTENSION_API_ONLY(以便我们可以在应用程序扩展中使用它)。
  • 我们目前正在通过SPM模块将应用程序模块化,这意味着将这些框架转换为SPM模块。

问题:

SPM模块未标记为应用程序扩展安全,因此对于每个链接到应用程序扩展的SPM模块,都会发出警告,对于每个应用程序扩展(这会产生相当多的警告)。

评论:

我还没有找到一种方法来设置SPM模块上的此标志。

到目前为止,我唯一找到的是一种完全禁用警告的方法,即将no_application_extension链接器标志设置为SPM目标 - 但是,如果我在应用程序扩展中使用不可用的API,则不会收到任何警告或错误(我尝试在模块中使用UIApplication.shared,我没有收到任何警告或错误;如果我尝试在现有框架上这样做,我会立即收到编译器错误)。

如果我将application_extension链接器标志设置为SPM目标,那么不仅在使用应用程序扩展中不可用的API时不会收到任何警告或错误,而且在构建应用程序时也会收到许多警告,因为许多应用程序使用的其他框架不可用于应用程序扩展中。

问题:

如何使我的SPM模块具有与在Xcode目标中设置APPLICATION_EXTENSION_API_ONLY标志时相同的行为?

这意味着:

  • 在应用程序扩展中使用被标记为应用程序扩展安全使用的模块时不会收到任何警告
  • 同时在此类模块使用应用程序扩展中不可用的API时仍会得到错误信息

理想情况下,有一种简单的方法可以在SPM模块上设置APPLICATION_EXTENSION_API_ONLY标志并恢复熟悉的行为。

谢谢


你可能认为将application-extension链接器标志设置为目标,同时在应用程序目标的其他链接器标志中设置-no_application_extension标志,就可以获得预期的行为。不幸的是,在测试后,它实际上完全禁用了警告(类似于第一个解决方法)。 - KPM
2个回答

3

我们找到了使用的方法

swiftSettings: [
                .unsafeFlags(["-Xfrontend", "-application-extension"])
            ],
linkerSettings: [
                .unsafeFlags(["-Xlinker", "-application_extension"])
            ]

第一个设置是为了在Xcode中立即给您一个漂亮的红色编译错误,如果您尝试使用一些不安全的API。第二个设置告诉链接器“这是一个扩展安全包”,因此如果您将该包链接到扩展目标或另一个扩展安全的框架,您将不会收到警告。


0

虽然我不确定,但我在这里读到了一些东西,使用SPM集成所有内容可能会很麻烦。

基本上,如Xcode 13 beta 3发布说明所述:

从应用程序扩展目标或watchOS中链接Swift包不再发出有关链接到不安全的库的无法解决的警告 应用程序。这意味着引用已注释为不适用于应用程序扩展的API的代码现在必须自身被注释为不适用于 应用程序扩展,以允许该代码在应用程序和应用程序扩展中使用。(66928265)

您可以添加以下内容:

@available(iOSApplicationExtension, unavailable)

属性来声明使用应用程序扩展不可用的API,以便以适用于应用程序和应用程序扩展的方式进行编译。


2
是的,我知道这一点,但我不明白它与我的问题有什么关系 :) 我不需要使用对我的扩展程序不可用的方法。如果我这样做(或者没有使用所述的注释),我想要得到一个错误提示。 - KPM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接