iOS 8扩展如何检测运行

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

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

'sharedApplication' is unavailable: not available iOS (App Extension)

因此,我需要一种方法来检测我是否在扩展中并使用to sharedApplication如果是这种情况)。

您可以使用预处理器宏:

在项目设置中,使用顶部栏中的下拉列表选择您的扩展目标: 在此处输入图像描述

然后:

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

然后在你的代码中:

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

预处理器宏将主要工作,但不能在共享库中工作(例如cocoapods或共享框架)。

或者,您可以使用以下代码。

 @implementation ExtensionHelpers +(BOOL) isAppExtension { return [[[NSBundle mainBundle] executablePath] containsString:@".appex/"]; } @end 

这项工作通过检查bundle executablePath,因为只有App Extension具有扩展名“.appex”。

正如Apple的文档所说:

当您基于Xcode模板构建扩展时,您将获得以.appex结尾的扩展束。

所以,我们可以使用以下代码:

 if ([[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]) { // this is an app extension } 

您可以在扩展目标上添加预处理器宏,然后使用类中的#ifdef进行检查。

对于我的共享库,我创建了一个单独的目标,其app扩展标志设置为yes,并在该特定目标的构建设置中使用预处理器宏。