Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测运行目标是应用程序扩展还是iOS应用程序_Ios_Objective C_Target_Ios App Extension_Ios8 Today Widget - Fatal编程技术网

检测运行目标是应用程序扩展还是iOS应用程序

检测运行目标是应用程序扩展还是iOS应用程序,ios,objective-c,target,ios-app-extension,ios8-today-widget,Ios,Objective C,Target,Ios App Extension,Ios8 Today Widget,我有一个简单的应用程序,它也有一个iOS 8 Today扩展(或widget)。我正在做的一件事是在我的应用程序和我的小部件之间共享代码类,因为很明显,这使我不必拥有同一代码的多个副本。除了我遇到的一个问题之外,所有这些都运行得很好,其中一个APIUIApplication sharedApplication出现了一个错误,因为您无法在iOS 8小部件上使用它 所以我想的是,有一个简单的if语句,它检查最终目标是本机应用程序还是iOS 8小部件,然后根据需要添加代码。这样行吗 这是我的密码: i

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

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

这是我的密码:

if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]))
    {
        CGSize ssz = sz;
        sz = CGSizeMake(ssz.height, ssz.width);
    }
如何更改此代码,以便可以执行以下操作之一:

  • 只有当最终目标是本机iOS应用程序而不是小部件时,才运行/编译
  • 检查该API是否在目标平台上可用,如果可用,则使用它

  • 我希望我的问题有意义,谢谢你的时间,Dan。

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

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

  • 在today扩展的项目设置中的“其他C标志”下,添加您自己的自定义编译器宏。对于名为
    TODAY\u EXTENSION
    的宏,添加
    -DTODAY\u EXTENSION
  • 在代码中,使用以下命令检查此宏

    #ifndef TODAY_EXTENSION
    ... app-only code here ...
    #endif
    
    相反,应该只存在于扩展中的代码

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

  • 汤姆的答案是正确的。另一种方法是在prefix.pch文件中为扩展目标定义宏,假设每个目标使用单独的前缀文件

    #define TODAY_EXTENSION YES
    

    我个人更喜欢这种方法,因为你可以在使用宏的任何地方命令单击宏,以查看宏的定义。

    ,这样你就可以在
    #ifndef
    语句中添加
    else
    语句。你还知道苹果为什么禁止iOS 8扩展中的sharedApplication吗?如果需要,你可以使用
    #else
    。你得到了全部,这可以做很多。至于
    sharedApplication
    ,这是因为扩展作为插件运行到一个单独的进程,该进程可以在不同的时间运行不同的扩展,所以
    sharedExtension
    无论如何都不会工作相同。肯定有运行时检查吗?我需要在应用程序和扩展程序都使用的扩展中使用此代码。@supertecnoboff只是出于兴趣,你怎么看?