备忘:取照片第三方库的编译问题 2025-06-27 周五

问题描述

本来一切都好,突然有一天,编译不过了


编译不过

出错信息如下:

Swift Compiler Error (Xcode): Cannot find 'TARGET_OS_SIMULATOR' in scope
/Users/zxs/git/gobuy/ios/Pods/TLPhotoPicker/TLPhotoPicker/Classes/TLPhotosPickerViewController.swift:127:15

Could not build the application for the simulator.
Error launching application on iPhone 16 Pro.

原因分析

  • 按照出错信息,大概的意思是由Pods管理的第三方库TLPhotoPicker有个文件TLPhotosPickerViewController.swift;它的第127行有个变量TARGET_OS_SIMULATOR未定义,导致编译不过。

  • 通过XCode打开Runner工程,发现确实有问题:


    未定义错误
  • 上豆包提问“TARGET_OS_SIMULATOR 是什么?怎么用?”,有如下回答:
    在 Objective-C 代码里,可以这样使用TARGET_OS_SIMULATOR:

#ifdef TARGET_OS_SIMULATOR
    // 模拟器环境下执行的代码
    NSLog(@"当前运行在模拟器上");
#else
    // 真机环境下执行的代码
    NSLog(@"当前运行在真实设备上");
#endif

在 Swift 里,没有直接对应的TARGET_OS_SIMULATOR宏,但可以通过arch()函数来判断:

#if targetEnvironment(simulator)
    // 模拟器环境下执行的代码
    print("当前运行在模拟器上")
#else
    // 真机环境下执行的代码
    print("当前运行在真实设备上")
#endif
  • 总之大致的意思是TARGET_OS_SIMULATOR作用是定义模拟器,但是只能在OC中用,Swift中不能用,需要用targetEnvironment(simulator)替代。

  • 为了验证这种说法,整个工程全局搜索TARGET_OS_SIMULATOR,发现有多个第三方库用了TARGET_OS_SIMULATOR这个宏,只有TLPhotoPicker是Swift,其他的都是Object-C


    就一个Swift在用

如何解决?

  • 代码错误
public struct Platform {
    public static var isSimulator: Bool {
    return TARGET_OS_SIMULATOR != 0 // Use this line in Xcode 7 or newer
    }
}

这段代码的意思是判断是不是模拟器;TARGET_OS_SIMULATOR是一个布尔值,直接用 != 0 这种写法也是很业余的。看看其他三方库怎么写的?

+ (BOOL)isSimulator {
#if TARGET_OS_SIMULATOR
  return YES;
#elif TARGET_OS_MACCATALYST
  return NO;
#elif TARGET_OS_IOS || TARGET_OS_TV
  NSString *platform = [GULAppEnvironmentUtil deviceModel];
  return [platform isEqual:@"x86_64"] || [platform isEqual:@"i386"];
#elif TARGET_OS_OSX
  return NO;
#endif
  return NO;
}
  • 修改代码:
public struct Platform {
    public static var isSimulator: Bool {
        #if targetEnvironment(simulator)
            return true
        #else
            return false
        #endif
    }
}

后遗症

  • 实在想不明白,都能写第三方库了,怎么会出现这么低级的代码错误。
  • 第三方库是通过Pods来管理的,这样手动解锁修改,在执行pod install等命令的时候,可能会被改回去。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容