27

我想知道我们如何检查新的 iOS 10 APIUIFeebackGenerator在当前设备上是否可用。还有一些我们需要检查的东西:

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

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

有人知道解决方案吗?或者,也许我们需要为此提交一份 Apple Radar。谢谢!

4

6 回答 6

21

有一些无证的“私人事物”:

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/

于 2017-02-05T21:38:31.407 回答
15

根据Apple 的UIFeedbackGenerator文档,听起来 iOS 会为您做到这一点。

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

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

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

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

启用系统触觉设置时。

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

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

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

于 2017-01-03T15:01:36.733 回答
15

iOS 13开始,您可以通过非常简单的方式对其进行检查。根据文档页面,您所要做的就是:

import CoreHaptics

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

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

于 2020-03-05T18:35:23.843 回答
5

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

extension UIDevice {
    
        static var isHapticsSupported : Bool {
            let feedback = UIImpactFeedbackGenerator(style: .heavy)
            feedback.prepare()
            return feedback.description.hasSuffix("Heavy>")
        }
    }

你像这样使用它:

UIDevice.isHapticsSupported 

返回truefalse

于 2019-02-20T10:45:33.357 回答
1

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

UIDevice.currentDevice().valueForKey("_feedbackSupportLevel");

这些方法似乎返回:

  • 0 = Taptic 不可用

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

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

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

于 2018-04-20T15:00:18.523 回答
0

这适用于 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
    }
}
于 2018-12-12T06:31:23.250 回答