Подтвердить что ты не робот

Как проверить, поддерживается ли Haptic Engine (UIFeedbackGenerator)

Мне интересно, как мы можем проверить, доступен ли новый iOS 10 API UIFeebackGenerator на текущем устройстве. Есть еще несколько вещей, которые нам нужно проверить:

  • Устройство должно запускать iOS 10.0 или новее
  • Устройство должно быть iPhone 7 или более поздним.
  • Haptic Engine необходимо включить в настройках

Первые две проверки могут быть достигнуты с помощью оператора #available(iOS 10, *) и обнаружения (хакерского) устройства, но последнее, похоже, не может быть проверено.

Знает ли кто-нибудь решение для этого? Или, может быть, нам нужно подать Apple Radar для этого. Спасибо!

4b9b3361

Ответ 1

Основываясь на Apple UIFeedbackGenerator документации, похоже на iOS, это для вас.

Обратите внимание, что вызов этих методов напрямую не воспроизводит haptics. Вместо этого он информирует систему о событии. Затем система определяет, следует ли воспроизводить haptics на основе устройства, состояние приложений, количество оставшегося заряда аккумулятора и другое факторы.

Например, в настоящий момент воспроизводится только тактическая обратная связь:

На устройстве с поддержкой Taptic Engine (iPhone 7 и iPhone 7 Плюс).

Когда приложение работает на переднем плане.

Если включен параметр "Системные настройки".

Даже если вам не нужно беспокоиться о проверке того, может ли устройство делать тактическую обратную связь, вам все равно нужно убедиться, что он вызван только с iOS 10 или выше, поэтому вы можете выполнить это с помощью этого:

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

Здесь краткое описание различных вариантов гаплотической обратной связи, доступных в iOS 10.

Ответ 2

Там есть недокументированная "частная вещь":

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

it возвращает 2 для устройств с тактильной обратной связью - iPhone 7/7 +, поэтому вы можете легко использовать это для генерации обратной связи Haptic:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.prepare()
generator.impactOccurred()

возвращает 1 для iPhone 6S, здесь резерв для создания 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)

и возвращает 0 для iPhone 6 или более старых устройств. Поскольку это своего рода недокументированная вещь, это может заблокировать вас на этапе обзора, хотя мне удалось пройти проверку и отправить приложение с такой проверкой.

Подробнее: http://www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with-uifeedbackgenerator/

Ответ 3

Вы знаете, что ваше устройство поддерживает эффект Haptic вибрации или нет с приведенным ниже кодом,

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

Эти методы, кажется, возвращают:

  • 0 = Лента недоступна

  • 1 = Первое поколение (протестировано на iPhone 6s)... которое НЕ поддерживает UINotificationFeedbackGenerator и т.д.

  • 2 = Второе поколение (протестировано на iPhone 7)... которое поддерживает его.

он возвращает 2 для устройств с тактильной обратной связью - iPhone 7/7+ или выше, так что вы можете легко использовать это для генерации обратной связи Haptic

Ответ 4

Это будет работать для 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
    }
}