代码之家  ›  专栏  ›  技术社区  ›  Stelabouras

自定义CIKernel和iOS7

  •  0
  • Stelabouras  · 技术社区  · 10 年前

    我有一个iOS项目,支持运行iOS 7和8的设备(项目部署目标:7.0),我最近开始使用iOS 8中引入的新API实现自定义CIKernel。

    虽然代码在每个iOS 8设备上编译和运行都没有问题,但每次我尝试在iOS 7设备上运行它时,都会出现以下错误:

    dyld: Symbol not found: _OBJC_CLASS_$_CIColorKernel
      Referenced from: /var/mobile/Applications/...
      Expected in: /System/Library/Frameworks/CoreImage.framework/CoreImage
     in /var/mobile/Applications/...
    

    生成错误的代码如下:

    kernel = [CIColorKernel kernelWithString:kernelStr];
    

    这个 kernelWithString: 方法是在iOS8中引入的,正如CIKernel.h声明的那样:

    __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
    

    所以我的问题是:我如何使应用程序在iOS 7和8设备上运行,并仅禁用iOS 7设备的自定义CIKernel功能?这可能吗?

    请注意,我已将CoreImage.framework从项目设置中的“必需”更改为“可选”,并且该应用程序在iOS7.0设备中运行,但老实说,这感觉真的很粗糙。

    我还尝试过预处理器命令: __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_OS_VERSION_MAX_ALLOWED 但这些仅在编译时有用。

    有线索吗?

    2 回复  |  直到 10 年前
        1
  •  1
  •   David Hayward    10 年前

    尝试使用此选项:

    Class colorKernelClass = NSClassFromString(@"CIColorKernel");
    kernel = [colorKernelClass kernelWithString:str];
    
        2
  •  0
  •   MirekE    10 年前

    所以我的问题是:我如何使应用程序在iOS 7和8设备上运行,并仅禁用iOS 7设备的自定义CIKernel功能?这可能吗?

    您可以像这样在运行时检查操作系统的版本:

    NSString *osVer = [[UIDevice currentDevice] systemVersion]
    

    这提供了一个字符串,您可以解析并提取主要版本。。。