【问题标题】:Detect whether run target is App Extension or iOS App检测运行目标是App Extension还是iOS App
【发布时间】:2023-04-06 11:32:01
【问题描述】:

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

所以我想的是有一个简单的 if 语句,它检查最终目标是本机应用程序还是 iOS 8 小部件,然后根据需要添加代码。这行得通吗?

这是我的代码:

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

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

  1. 仅运行/编译 IF 最终目标是原生 iOS 应用而不是小部件。
  2. 检查目标平台上是否有该 API,如果有,则使用它?

我希望我的问题有意义,感谢您抽出宝贵时间,Dan。

【问题讨论】:

  • @supertecnoboff 只是出于兴趣,你怎么看?

标签: ios objective-c target ios-app-extension ios8-today-widget


【解决方案1】:

运行时检查已取消,因为 Xcode 不允许您编译使用 sharedApplication 的扩展代码。它必须是编译时检查。

很遗憾,此检查不是内置的,您必须添加它。您需要执行以下操作:

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

  1. 在你的代码中,使用类似的东西检查这个宏

    #ifndef TODAY_EXTENSION
    ... app-only code here ...
    #endif
    

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

    #ifdef TODAY_EXTENSION
    ... extension-only code here ...
    #endif
    

【讨论】:

  • 然后您可以在#ifndef 语句中添加else 语句?
  • 另外你知道为什么苹果在 iOS 8 Extensions 中禁止 sharedApplication 吗?
  • 如果需要,可以使用#else。你会得到整个C preprocessor,它可以做很多事情。至于sharedApplication,这是因为扩展作为插件运行到一个单独的进程中,可以在不同的时间运行不同的扩展,所以sharedExtension无论如何都不会工作。
  • 肯定有运行时检查?我需要在应用程序和扩展程序都使用的扩展程序中使用此代码。
【解决方案2】:

汤姆的回答是对的。另一种选择是在您的扩展目标的 prefix.pch 文件中定义宏,假设您为每个目标使用单独的前缀文件。

#define TODAY_EXTENSION YES

我个人更喜欢这种方法,因为您可以通过命令单击进入宏,无论它用于查看它的定义位置。

【讨论】:

    【解决方案3】:

    对于 Swift 项目,您应该将其添加到目标的构建设置中,位于 Swift Compiler - Custom Flags > Active Compilation Conditions 下。

    更好的是,我把它放在我的 xcconfig 文件中,这样可以轻松维护:

    SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) iOS_EXTENSION
    

    【讨论】:

      猜你喜欢
      • 2015-01-16
      • 2013-02-06
      • 2016-07-28
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      相关资源
      最近更新 更多