web-dev-qa-db-ja.com

Haptic Engine(UIFeedbackGenerator)がサポートされているかどうかを確認する方法

新しいiOS 10 API UIFeebackGeneratorが現在のデバイスで利用可能かどうかを確認する方法を知りたいのですが。確認する必要があることがいくつかあります。

  1. デバイスはiOS 10.0以降を実行する必要があります
  2. デバイスはiPhone 7以降である必要があります
  3. 触覚エンジンは設定でオンにする必要があります

最初の2つのチェックは#available(iOS 10, *)ステートメントと(ハッキングされた)デバイス検出を使用して実行できますが、後者のチェックはチェックできないようです。

誰かがこれに対する解決策を知っていますか?あるいは、Appleレーダーを提出する必要があるかもしれません。ありがとう!

19
Hans Knöchel

AppleのUIFeedbackGeneratorドキュメント に基づいて、iOSがそれを行うように聞こえます。

これらのメソッドを呼び出しても、触覚は直接再生されないことに注意してください。代わりに、システムにイベントを通知します。 システムは、デバイス、アプリケーションの状態、バッテリー残量、およびその他の要因に基づいて、ハプティックスを再生するかどうかを決定します。

たとえば、触覚フィードバックは現在のみ再生されます。

サポートされているTaptic Engineを搭載したデバイス(iPhone 7およびiPhone 7 Plus)。

アプリがフォアグラウンドで実行されているとき。

System Haptics設定が有効な場合。

デバイスが触覚フィードバックを実行できるかどうかを確認する必要がない場合でも、iOS 10以降でのみ呼び出されることを確認する必要があるため、次のように実行できます。

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

これが さまざまな触覚フィードバックオプションの簡単な要約 iOS 10で利用可能です。

7
Adrian

文書化されていない「プライベートなもの」があります。

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

itは、触覚フィードバックを備えたデバイスでは2を返します-iPhone 7/7 +なので、これを使用して触覚フィードバックを簡単に生成できます。

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

iPhone 6Sの場合は1を返します。ここにタプティックを生成するためのフォールバックがあります。

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/

14
Mikita Manko

プライベート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 

trueまたはfalseを返します

5
Rom4in

これは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
    }
}
1
Yogendra Singh

あなたはあなたのデバイスが触覚振動効果をサポートしているかどうかを以下のコードで知っています、

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

これらのメソッドは以下を返すようです:

  • =タプティックは使用できません

  • 1 =第1世代(iPhone 6sでテスト済み)... UINotificationFeedbackGeneratorなどをサポートしていません

  • 2 =第2世代(iPhone 7でテスト済み)...これはサポートしています。

触覚フィードバックを備えたデバイスに対しては2を返します-iPhone 7/7 +以上なので、これを使用して触覚フィードバックを簡単に生成できます

1
Ashish