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

时间:2017-01-03 13:08:39

标签: ios ios10 haptic-feedback uifeedbackgenerator

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

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

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

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

6 个答案:

答案 0 :(得分:13)

有一些没有证件的私人物品":

UIDevice.currentDevice().valueForKey("_feedbackSupportLevel");
对于具有触觉反馈的设备, 返回2 - iPhone 7/7 +,因此您可以轻松地使用它来生成触觉反馈:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.prepare()
generator.impactOccurred()
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)
适用于iPhone 6或更早版本设备的

返回0 。由于它是一种无证的东西,它可能在审查阶段阻止你,虽然我能够通过审查并提交带有这种支票的应用程序。

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

答案 1 :(得分:6)

基于Apple's UIFeedbackGenerator documentation,听起来像iOS就是这样。

  

请注意,调用这些方法不会直接播放触觉。   相反,它会通知系统事件。 系统然后   决定是否根据设备播放触觉,   应用程序的状态,剩余的电池电量等   因素。

     

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

     

在支持Taptic Engine的设备上(iPhone 7和iPhone 7   加)。

     

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

     

启用系统触觉设置时。

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

    if #available(iOS 10,*) {
        // your haptic feedback method
    }

此处有{10}在iOS 10中可用。

答案 2 :(得分:5)

在iOS 13上,您可以非常直接地对其进行检查。在this文档页面之后,您要做的就是:

iOS 13,Swift 5

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

答案 3 :(得分:2)

我不使用私有API扩展了UIDevice

extension UIDevice {

 static var isHapticsSupported : Bool {

    let feedback = UIImpactFeedbackGenerator(style: .heavy)
    feedback.prepare()
    var string = feedback.debugDescription
    string.removeLast()
    let number = string.suffix(1)

    if number == "1" {
        return true
    } else {
        return false
    }
  }
}

,您可以这样使用它:

UIDevice.isHapticsSupported 

返回truefalse

答案 4 :(得分:1)

您知道您的设备是否支持触觉振动效果,代码如下,

df1.assign(Index=df1.index // 3).pivot('Index', 'Name', 'Value')

Name  classe code series
Index                   
0         12   10      B
1          1   12      C
2         18   16      A

这些方法似乎回归:

  • 0 =没有Taptic

  • 1 =第一代(在iPhone 6s上测试过)......没有 支持UINotificationFeedbackGenerator等

  • 2 =第二代(在iPhone 7上测试)......支持 它

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

答案 5 :(得分:1)

这将适用于iPhone 7及更高版本。

 var count = 0

 override func viewDidLoad() {
    super.viewDidLoad()

    let myButton = UIButton(frame: CGRect(x: 0, y: 100, width: 100, height: 50))
    myButton.setTitleColor(UIColor.green, for: .normal)
    myButton.setTitle("Press ME", for: .normal)
    myButton.addTarget(self, action: #selector(myButtonTapped), for: .touchUpInside)
    self.view.addSubview(myButton)

}

@objc func myButtonTapped() {
    count += 1
    print("Count \(count)")

    switch count {
    case 1:
        let generator = UINotificationFeedbackGenerator()
        generator.notificationOccurred(.error)

    case 2:
        let generator = UINotificationFeedbackGenerator()
        generator.notificationOccurred(.success)

    case 3:
        let generator = UINotificationFeedbackGenerator()
        generator.notificationOccurred(.warning)

    case 4:
        let generator = UIImpactFeedbackGenerator(style: .light)
        generator.impactOccurred()

    case 5:
        let generator = UIImpactFeedbackGenerator(style: .medium)
        generator.impactOccurred()

    case 6:
        let generator = UIImpactFeedbackGenerator(style: .heavy)
        generator.impactOccurred()

    default:
        let generator = UISelectionFeedbackGenerator()
        generator.selectionChanged()
        count = 0
    }
}