如何检查机器是否有 Touch Bar

How to check if machine has a Touch Bar

有没有API检查运行机器是否有触摸条(或Xcode的触摸条模拟器)?

我有一些方法只有在触摸栏存在时才会被调用。如果我只是检查响应者 touchBar 属性 的可空性,即使机器不支持它,它也会自动创建一个 touchBar 实例。但是我不想在没有意义的时候创建一个。

来自苹果的NSTouchBar reference

There is no need, and no API, for your app to know whether or not there is a Touch Bar available. Whether your app is running on a machine that supports the Touch Bar or not, your app’s onscreen user interface (UI) appears and behaves the same way.

很明显 Apple 的观点是触摸条是 附加的 UI 它复制了其他地方可用的功能,因此您的应用程序不需要知道它是否存在与否。

所以你的问题的答案是没有 public API 用于此目的。

(我怀疑您可以弄清楚 - 考虑调用的委托、生成的事件等 - 无需调用任何私有 UI 或依赖机器 ID,但我不知道你可以。)

HTH

replicates functionality available elsewhere

这对 Apple 而言似乎非常愚蠢。假设您有一个 audio/video 应用程序,该应用程序具有某些东西的滑动条功能。没有触摸条,控件在屏幕上的主要 window 中。有了触摸条,它就在那里。那么,这是否意味着苹果想要这样的应用在两个地方同时有这样的控制?

我能看到他们允许应用程序执行此类功能的唯一 "downside" 是,它让拥有 Touchbar mac 的人很难(呃)解释如何使用所说的将应用程序提供给没有 Touchbar 的其他人(反之亦然)。

我可以看出(也许)他们不希望应用程序必须具有 在 Touchbar 上可用而其他任何方式都不可用的功能。但这让我觉得有点像对 iPhone/iPad 应用程序的开发人员说应用程序不需要知道它 运行 在哪个设备上。这就是他们添加自适应布局和特征的全部原因,对吧? "Touchbar/No-Touchbar"不一样吗?

这可能是他们 "Touchbar API 2.0 list" 最重要的事情之一 - 但他们知道,如果他们现在允许它,它可能会被 滥用某人。 (有人制作了一个应用程序,在有和没有 Bar 的情况下 根本 不同,所以它要么变得一团糟,试图解释 and/or 弄清楚,要么 TB 功能成为有点 "neglected stepchild interface" 而不是经过深思熟虑的东西。)

此函数检查系统是否为带 TouchBar 的 MacBook Pro ("MacBookPro13,2" & "MacBookPro13,3")。如果以后Apple发布其他带有Touch Bar的设备你必须更新这个功能。

func touchbarAvailable() -> Bool {
    var size = 0
    sysctlbyname("hw.model", nil, &size, nil, 0)
    var machine = [CChar](repeating: 0,  count: Int(size))
    sysctlbyname("hw.model", &machine, &size, nil, 0)

    if (String(cString: machine) == "MacBookPro13,2" || String(cString: machine) == "MacBookPro13,3") {
        return true
    }
    return false
}