iOS 8扩展如何检测运行
如果您在iOS 8扩展程序中运行,是否有人知道您如何在代码中检测到。
我有一个应用程序,它在应用程序和扩展程序之间共享类。 应用程序代码使用[UIApplication sharedApplication]
但这在扩展中不可用,因此它不会编译说:
'sharedApplication' is unavailable: not available iOS (App Extension)
因此,我需要一种方法来检测我是否在扩展中并使用to sharedApplication
如果是这种情况)。
您可以使用预处理器宏:
在项目设置中,使用顶部栏中的下拉列表选择您的扩展目标:
然后:
- 单击
Build Settings
- 在
Apple LLVM 6.0 - Preprocessing
下查找(或搜索)Preprocessor Macros
- 在调试和发布部分中添加
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,并在该特定目标的构建设置中使用预处理器宏。
- 有没有在iOS上的Web服务客户端代码生成器?
- 使用NSFetchedResult控制器和每个月的部分标题
- Xcode 9 GM – 导出并上传到App Store崩溃
- types'ViewController'不符合协议'UITableViewDataSource'
- 在iOS应用程序中使用字体(ttf或odf) – 它们是否正常工作? (SourceSansPro-ExtraLight)
- 自动布局如何将view2从右移动到底部?
- MPNowPlayingInfoCenter nowPlayingInfo通过AirPlay忽略AVPlayer音频
- UICollectionView VS UITableview
- 使UITextView父项成为它自己的inputAccessoryView