2017-01-03 13 views
7

Мне интересно, как мы можем проверить, доступен ли новый iOS 10 API UIFeebackGenerator на текущем устройстве. Есть еще несколько вещей, которые мы должны были бы проверить:Как проверить, поддерживается ли Haptic Engine (UIFeedbackGenerator)

  1. Устройство должно работать IOS 10.0 или более поздняя версия
  2. Устройство должно быть iPhone 7 или более поздней версии необходимо
  3. тактильной Двигатель должен быть включен в настройках

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

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

ответ

4

Основано на Apple's UIFeedbackGenerator documentation, звучит как iOS, это для вас.

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

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

На устройстве с поддерживаемым Taptic Engine (iPhone 7 и iPhone 7 Plus).

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

При включенной настройке Haptics.

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

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

Вот a quick summary of the various haptic feedback options доступны в прошивке 10.

+3

Что делать, если вы хотите, чтобы возвратиться к использованию старого AudioServicesPlaySystemSound если taptic двигатель не доступен? –

+0

@ DanielLarsson Это может быть полезно. Вы хотите проверить iOS до версии 10. http://nshipster.com/swift-system-version-checking/ – Adrian

+0

@ Adrian только что протестирован с iOS 9, кажется, что он ничего не делает (не сбой приложения). – Idan

5

Там какое-то недокументированное "частное дело":

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

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

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/