如何检查是否支持Haptic Engine(UIFeedbackGenerator)

Han*_*hel 16 ios haptic-feedback ios10 uifeedbackgenerator

我想知道我们如何检查UIFeebackGenerator当前设备上是否有新的iOS 10 API .还有一些我们需要检查的事情:

  1. 设备需要运行iOS 10.0或更高版本
  2. 该设备需要是iPhone 7或更高版本
  3. 需要在"设置"中打开触觉引擎

前两个检查可以使用#available(iOS 10, *)语句和(hacky)设备检测来实现,但后者似乎不可检查.

有人知道这方面的解决方案吗?或许我们需要为此提交Apple Radar.谢谢!

小智 15

有一些无证的"私事":

UIDevice.currentDevice().valueForKey("_feedbackSupportLevel");
Run Code Online (Sandbox Code Playgroud)

对于具有触觉反馈的设备,它会返回2 - iPhone 7/7 +,因此您可以轻松地使用它来生成触觉反馈:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.prepare()
generator.impactOccurred()
Run Code Online (Sandbox Code Playgroud)

为iPhone 6S 返回1,这是生成taptic的后备:

import AudioToolbox

AudioServicesPlaySystemSound(1519) // Actuate `Peek` feedback (weak boom)
AudioServicesPlaySystemSound(1520) // Actuate `Pop` feedback (strong boom)
AudioServicesPlaySystemSound(1521) // Actuate `Nope` feedback (series of three weak booms)
Run Code Online (Sandbox Code Playgroud)

并为iPhone 6或更早版本的设备返回0.由于它是一种无证件的东西,它可能在审查阶段阻止你,虽然我能够通过审查并提交带有这种检查的应用程序.

更多细节:http: //www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with-uifeedbackgenerator/


Wit*_*ski 12

从 iOS 13 开始,您可以以非常简单的方式检查它。根据文档页面,您所要做的就是:

iOS 13 及更新版本,Swift 5.3

import CoreHaptics

var supportsHaptics: Bool = false
...
// Check if the device supports haptics.
let hapticCapability = CHHapticEngine.capabilitiesForHardware()
supportsHaptics = hapticCapability.supportsHaptics
Run Code Online (Sandbox Code Playgroud)

文档:准备您的应用程序以播放触觉


Adr*_*ian 10

根据Apple的UIFeedbackGenerator文档,iOS之类的声音可以帮助您.

请注意,调用这些方法不会直接播放触觉.相反,它会通知系统事件.然后,系统基于设备,应用程序的状态,剩余的电池电量以及其他因素来确定是否播放触觉.

例如,目前仅播放触觉反馈:

在支持Taptic Engine(iPhone 7和iPhone 7 Plus)的设备上.

当应用程序在前台运行时.

启用"系统触觉"设置时.

即使您不需要担心检查设备是否可以进行触觉反馈,您仍然需要确保它仅在iOS 10或更高版本中调用,因此您可以通过以下方式实现:

    if #available(iOS 10,*) {
        // your haptic feedback method
    }
Run Code Online (Sandbox Code Playgroud)

以下是iOS 10中各种触觉反馈选项的快速摘要.

  • 如果您想要在没有taptic引擎的情况下使用旧的AudioServicesPlaySystemSound,该怎么办? (10认同)

Rom*_*4in 5

我在UIDevice不使用私有API的情况下进行了扩展

extension UIDevice {

static var isHapticsSupported : Bool {
    let feedback = UIImpactFeedbackGenerator(style: .heavy)
    feedback.prepare()
    return feedback.description.hasSuffix("Heavy>")
}
Run Code Online (Sandbox Code Playgroud)

},您可以像这样使用它:

UIDevice.isHapticsSupported 
Run Code Online (Sandbox Code Playgroud)

返回truefalse