检测运行目标是App Extension还是iOS App

16 objective-c target ios ios-app-extension ios8-today-widget

我有一个简单的应用程序,它也有iOS 8今日扩展(或小部件).我正在做的一件事是在我的应用程序和我的小部件之间共享代码类,因为这显然使我不必拥有相同代码的多个副本.除了我遇到的一个问题之外,这一切都很UIApplication sharedApplication好用,其中一个API 会出现错误,因为你无法在iOS 8 Widgets上使用它.

所以我想到的是,有一个简单的if语句,用于检查最终目标是否是本机应用程序,或者如果它是iOS 8小部件,然后根据需要添加代码.那会有用吗?

这是我的代码:

if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]))
    {
        CGSize ssz = sz;
        sz = CGSizeMake(ssz.height, ssz.width);
    }
Run Code Online (Sandbox Code Playgroud)

如何更改此代码,以便可以执行以下操作之一:

  1. 仅运行/编译,如果最终目标是本机iOS应用程序而不是小部件.
  2. 或者检查目标平台上的API是否可用,如果是,则使用它?

我希望我的问题有道理,感谢你的时间,丹.

Tom*_*ton 31

运行时检查已经结束,因为Xcode不会让你编译使用的扩展代码sharedApplication.它必须是编译时检查.

不幸的是,这个检查不是内置的,你必须添加它.你需要做一些事情:

  1. 在今天扩展的项目设置中,在"其他C标志"下,添加您自己的自定义编译器宏.对于名为的宏TODAY_EXTENSION,添加-DTODAY_EXTENSION:

在此输入图像描述

  1. 在您的代码中,使用类似的方法检查此宏

    #ifndef TODAY_EXTENSION
    ... app-only code here ...
    #endif
    
    Run Code Online (Sandbox Code Playgroud)

    相反,应存在于扩展中的代码看起来像

    #ifdef TODAY_EXTENSION
    ... extension-only code here ...
    #endif
    
    Run Code Online (Sandbox Code Playgroud)