ios 如何在Swift软件包管理器(SPM)目标上设置APPLICATION_EXTENSION_API_ONLY?

92vpleto  于 2022-12-20  发布在  iOS
关注(0)|答案(1)|浏览(265)
    • bounty将在3天后过期**。回答此问题可获得+100声望奖励。KPM希望引起更多人对此问题的关注:我希望解决方案能同时满足这两个标准(在应用扩展中使用模块时没有警告,但在模块中使用不安全的API时仍然会出现错误),当然也能与最新的工具(Xcode 14 + Swift 5.7)配合使用。
    • 背景:**
  • 我们有一个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标志,即可恢复熟悉的行为。
谢啦,谢啦

t5fffqht

t5fffqht1#

虽然我不确定这一点,但我读到一些东西here,它将是一个痛苦的集成一切使用SPM
基本上如Xcode 13 beta 3发行说明所述:
从应用程序扩展目标或watchOS应用程序链接Swift软件包时,不再发出无法解决的警告,即链接到在应用程序扩展中使用不安全的库。这意味着引用被标注为在应用程序扩展中不可用的API的代码,现在必须将其自身标注为在应用程序扩展中不可用。以便允许在应用程序和应用程序扩展中使用该代码。(66928265)
您可以添加:
@可用(iOS应用程序扩展,不可用)
属性添加到使用应用扩展不可用API的声明中,以使其以适用于应用和应用扩展的方式进行编译。

相关问题