如何从Swift中确定设备类型? (OS X或iOS)

时间:2014-06-05 16:05:50

标签: ios macos swift

我知道Swift相对较新,但我想知道是否有办法确定设备类型?

(就像以前一样可以使用#define)?

主要是我想知道如何区分OS X或iOS。我在这个问题上一无所获。

7 个答案:

答案 0 :(得分:64)

如果您正在构建iOS和OS X(现在也可能是watchOS和tvOS),那么您至少要构建两次代码:每个平台一次。如果要在每个平台上执行不同的代码,则需要构建时条件,而不是运行时检查。

Swift没有预处理器,但它确实有条件构建指令 - 并且在大多数情况下,它们看起来像C等价物。

#if os(iOS) || os(watchOS) || os(tvOS)
    let color = UIColor.redColor()
#elseif os(OSX)
    let color = NSColor.redColor()
#else
    println("OMG, it's that mythical new Apple product!!!")
#endif

您还可以使用构建配置来测试体系结构(x86_64armarm64i386)或-D编译器标志(包括{ {1}}标志由标准Xcode模板定义。)

请参阅使用Swift与Cocoa和Objective-C 中的Preprocessor Directives

(如果你想区分你在运行时使用哪种类型的iOS设备,请像使用ObjC一样使用DEBUG类。它通常更有用,更安全。在您重要的设备属性而不是设备名称或习惯用法 - 例如,使用特征和大小类来布置您的UI,查询OpenGL以获得所需的GPU功能等。)

答案 1 :(得分:3)

自Swift 4.2起,您可以替换

#if os(iOS) || os(watchOS) || os(tvOS)
    let color = UIColor.redColor()
#elseif os(OSX)
    let color = NSColor.redColor()
#else
     println("OMG, it's that mythical new Apple product!!!")
#endif

#if canImport(UIKit)
    let color = UIColor.redColor()
#elseif os(OSX)
    let color = NSColor.redColor()
#else
    #error("OMG, it's that mythical new Apple product!!!")
#endif

答案 2 :(得分:2)

这应该为您提供所有用例:

#if os(OSX)
    print("macOS")
#elseif os(watchOS)
    print("watchOS")
#elseif os(tvOS)
    print("tvOS")
#elseif os(iOS)
    #if targetEnvironment(macCatalyst)
        print("macOS - Catalyst")
    #else
        print("iOS")
    #endif
#endif

答案 3 :(得分:0)

为Mac Catalyst更新。现在,您还可以使用以下命令确定是iOS还是Mac Catalyst:

let color: UIColor
#if targetEnvironment(macCatalyst)
color = .systemRed
#else
color = .systemBlue
#endif

例如。

答案 4 :(得分:0)

Swift 4(2020 年 7 月 21 日更新)

enum TargetDevice {
    case nativeMac
    case iPad
    case iPhone
    case iWatch
    
    public static var currentDevice: Self {
        var currentDeviceModel = UIDevice.current.model
        #if targetEnvironment(macCatalyst)
        currentDeviceModel = "nativeMac"
        #elseif os(watchOS)
        currentDeviceModel = "watchOS"
        #endif
        
        if currentDeviceModel.starts(with: "iPhone") {
            return .iPhone
        }
        if currentDeviceModel.starts(with: "iPad") {
            return .iPad
        }
        if currentDeviceModel.starts(with: "watchOS") {
            return .iWatch
        }
        return .nativeMac
    }
}

用法:

print(AppUtilities.TargetDevice.currentDevice)

答案 5 :(得分:-2)

我已实施超轻量级库来检测已使用的设备https://github.com/schickling/Device.swift

可以通过Carthage进行安装,并按照以下方式使用:

call'
    from /home/ruby/.rbenv/versions/2.2.2/lib/ruby/2.2.0/tsort.rb:345:in

答案 6 :(得分:-2)

var device = UIDevice.currentDevice().model 

这段代码对我有用。我已经在textfield和keyboard上解决了部分问题。见下文。

func textFieldShouldBeginEditing(textField: UITextField) -> Bool
{

    print(device)

    if (textField.tag  == 1 && (device == "iPhone" || device == "iPhone Simulator" ))
    {
        var scrollPoint:CGPoint = CGPointMake(0,passwordTF.frame.origin.y/2);
        LoginScroll!.setContentOffset(scrollPoint, animated: true);
    }
    else if (textField.tag  == 2 && (device == "iPhone" || device == "iPhone Simulator"))
    {
        var scrollPoint:CGPoint = CGPointMake(0,passwordTF.frame.origin.y/1.3);
        LoginScroll!.setContentOffset(scrollPoint, animated: true);
    }

    return true

}