问题描述
本来一切都好,突然有一天,编译不过了
编译不过
出错信息如下:
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等命令的时候,可能会被改回去。