在 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
有一个 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