UI_USER_INTERFACE_IDIOM() 使仅在设备上分发的应用程序崩溃

UI_USER_INTERFACE_IDIOM() crashes app distributed on devices ONLY

我创建了一个示例单页 swift 基于语言的 iOS 应用程序,它在 viewDidLoad() 中的这个 func 调用时崩溃 -

func regularFont() -> UIFont {
    var fontSize : CGFloat = (UI_USER_INTERFACE_IDIOM() == .Pad) ? 15 : 12
    return UIFont.systemFontOfSize(fontSize)
}

但是一旦我用 Apple 推荐的 UIDevice() 方法替换这个 UI_USER_INTERFACE_IDIOM(),它就可以正常工作了。

func regularFont() -> UIFont {
    var fontSize : CGFloat = (UIDevice().userInterfaceIdiom == .Pad) ? 15 : 12
    return UIFont.systemFontOfSize(fontSize)
}

崩溃发生在我测试的所有设备上 - iPhone 5s、iPhone 6 和 iPad Air(全部在 iOS 8.x 上)并且它仅在设备上发生,不在模拟器上发生。

PS:该应用程序通过我们的 OTA/web link.

安装在所有设备上

令我惊讶的是,Apple 的 App Store 上还有另一个基于 objective c 语言的应用程序,它大量使用 UI_USER_INTERFACE_IDIOM(),并定期更新...但从未因此崩溃。

有什么想法吗?

我明白了(部分!)。实际上 swift 项目中 UI_USER_INTERFACE_IDIOM() 的“release” 实现使应用程序崩溃。

一旦我 将方案编辑为 "release"(Xcode > 产品 > 方案 > 编辑方案 > 运行 > 构建配置更改为"Release") 然后 运行 在 simulator/device,应用程序到处崩溃.. 所有 devices/simulators/developer/distribution 个配置文件。

但是,我仍然不知道为什么我们的应用商店应用(objective c 基于语言)没有崩溃。

我唯一的猜测是,这是 UI_USER_INTERFACE_IDIOM() API 实施中的一个小故障,使用了 Apple 的某些语言特定编码(swift vs objective c)。

无论如何,我会将所有 UI_USER_INTERFACE_IDIOM() 替换为 UIDevice(). userInterfaceIdiom。我希望这对某人有所帮助!

UI_USER_INTERFACE_IDIOM()只是一个Objective-C宏,定义为:

#define UI_USER_INTERFACE_IDIOM() \ ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? \ [[UIDevice currentDevice] userInterfaceIdiom] : \ UIUserInterfaceIdiomPhone)

所以当你使用Swift时,你需要使用as:

UIDevice.currentDevice().userInterfaceIdiom == .Pad
UIDevice.currentDevice().userInterfaceIdiom == .Phone
UIDevice.currentDevice().userInterfaceIdiom == .Unspecified

希望这对您有所帮助。

Swift 5.3 及更高版本:

if UIDevice.current.userInterfaceIdiom != .pad {
  // do stuff
}