如果您在App扩展程序中运行,是否有人知道您如何在代码中检测到?
我有一个应用程序,它在应用程序和扩展程序之间共享类。应用代码使用的是[UIApplication sharedApplication]
,但在扩展程序中无法使用,因此无法编译说:
' sharedApplication'不可用:iOS(App Extension)不可用
所以我需要一种方法来检测我在扩展程序中的情况,并使用sharedApplication
的替代方法,如果是这样的话。
答案 0 :(得分:46)
您可以使用预处理器宏:
在项目设置中,使用顶部栏中的下拉菜单选择您的扩展程序目标:
然后:
- 点击
Build Settings
- 在
下查找(或搜索)Preprocessor Macros
Apple LLVM 6.0 - Preprocessing
- 在调试和发布部分中添加
醇>TARGET_IS_EXTENSION
或您选择的任何其他名称。
然后在你的代码中:
#ifndef TARGET_IS_EXTENSION // if it's not defined
// Do your calls to UIApplication
#endif
答案 1 :(得分:27)
当您基于Xcode模板构建扩展时,您将获得以.appex结尾的扩展束。
因此,我们可以使用以下代码:
if ([[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]) {
// this is an app extension
}
答案 2 :(得分:23)
预处理器宏主要工作,但不能在共享库中工作(例如cocoapods或共享框架)。
或者您可以使用以下代码。
@implementation ExtensionHelpers
+(BOOL) isAppExtension
{
return [[[NSBundle mainBundle] executablePath] containsString:@".appex/"];
}
@end
这项工作通过检查bundle executablePath,因为只有App Extension具有扩展名“.appex”。
答案 3 :(得分:2)
您可以在扩展程序目标上添加预处理程序宏,然后使用您班级内的#ifdef
进行检查。
答案 4 :(得分:0)
对于我的共享库,我创建了一个单独的目标,其app扩展标志设置为yes,并在该特定目标的构建设置中使用预处理器宏。
答案 5 :(得分:0)
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`
答案 6 :(得分:0)