在 Swift 中,当 运行 来自 App Extension 目标时,如何忽略部分代码?

In Swift, how to ignore a part of the code when running from an App Extension target?

有一个 similar question 适用于 Objective-C,但我在 Swift 中尝试了相同的代码,但它从未执行,既不在主应用程序中,也不在操作扩展中。

我的情况和上面的问题差不多,就是在主app里运行的时候我想用UIApplication.shared.open在Safari里打开一个link,但我想忽略 App Extension 上的这部分代码。

问题不是找出应用程序是否来自应用程序扩展 运行 ,而是在为应用程序扩展构建时忽略代码,因此编译器不会给我以下错误构建中:

更新:请阅读 Apple 提供的 documentation on App Extensions:

Some APIs Are Unavailable to App Extensions

Because of its focused role in the system, an app extension is ineligible to participate in certain activities. An app extension cannot:

  • Access a Application.shared object, and so cannot use any of the methods on that object

- Apple, App Extension Programming Guide

要通过代码以编程方式查找它是否是 运行 扩展,这非常简单,只需执行以下操作:

let bundleUrl: URL = Bundle.main.bundleURL
let bundlePathExtension: String = bundleUrl.pathExtension
let isAppex: Bool = bundlePathExtension == "appex"

// `true` when invoked inside the `Extension process`
// `false` when invoked inside the `Main process`

您可以为扩展目标引入一个新的自定义标志(类似于 DEBUG 标志)。在您的构建设置中查找自定义标志并添加一个新标志(例如“EXTENSION”)。就像这里的截图一样,也是为了发布而做的。

在您的代码中,您可以执行类似

的操作
#if EXTENSION
    // here goes code that is only compiled in the extension
#else 
    // here goes code that is only compiled outside the extension 
#endif