如何检测代码是否在主应用程序或应用程序扩展目标中运行?

时间:2014-07-30 22:29:09

标签: ios uiapplicationdelegate ios-app-extension

如果您在App扩展程序中运行,是否有人知道您如何在代码中检测到?

我有一个应用程序,它在应用程序和扩展程序之间共享类。应用代码使用的是[UIApplication sharedApplication],但在扩展程序中无法使用,因此无法编译说:

  

' sharedApplication'不可用:iOS(App Extension)不可用

所以我需要一种方法来检测我在扩展程序中的情况,并使用sharedApplication的替代方法,如果是这样的话。

7 个答案:

答案 0 :(得分:46)

您可以使用预处理器宏:

在项目设置中,使用顶部栏中的下拉菜单选择您的扩展程序目标: enter image description here

然后:

  
      
  1. 点击Build Settings
  2.   
  3. Preprocessor Macros
  4. 下查找(或搜索)Apple LLVM 6.0 - Preprocessing   
  5. 在调试和发布部分中添加TARGET_IS_EXTENSION或您选择的任何其他名称。
  6.   

然后在你的代码中:

#ifndef TARGET_IS_EXTENSION // if it's not defined
    // Do your calls to UIApplication
#endif

答案 1 :(得分:27)

正如Apple's documentation所说:

  

当您基于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)

雨燕5

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)

圣诞老人提出的解决方案对我不起作用。

有效的是:

  1. 选择扩展目标
  2. 构建设置
  3. 搜索“自定义标志”
  4. 向调试和发布添加新标志(例如:“EXTENSION”)

enter image description here

现在代码:

#if EXTENSION
// IF is extension (SIRI) we do stuff
#else
// ELSE is main app do more stuff
#endif
相关问题