新しいiOS 10 API UIFeebackGenerator
が現在のデバイスで利用可能かどうかを確認する方法を知りたいのですが。確認する必要があることがいくつかあります。
最初の2つのチェックは#available(iOS 10, *)
ステートメントと(ハッキングされた)デバイス検出を使用して実行できますが、後者のチェックはチェックできないようです。
誰かがこれに対する解決策を知っていますか?あるいは、Appleレーダーを提出する必要があるかもしれません。ありがとう!
AppleのUIFeedbackGenerator
ドキュメント に基づいて、iOSがそれを行うように聞こえます。
これらのメソッドを呼び出しても、触覚は直接再生されないことに注意してください。代わりに、システムにイベントを通知します。 システムは、デバイス、アプリケーションの状態、バッテリー残量、およびその他の要因に基づいて、ハプティックスを再生するかどうかを決定します。
たとえば、触覚フィードバックは現在のみ再生されます。
サポートされているTaptic Engineを搭載したデバイス(iPhone 7およびiPhone 7 Plus)。
アプリがフォアグラウンドで実行されているとき。
System Haptics設定が有効な場合。
デバイスが触覚フィードバックを実行できるかどうかを確認する必要がない場合でも、iOS 10以降でのみ呼び出されることを確認する必要があるため、次のように実行できます。
if #available(iOS 10,*) {
// your haptic feedback method
}
これが さまざまな触覚フィードバックオプションの簡単な要約 iOS 10で利用可能です。
文書化されていない「プライベートなもの」があります。
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/
プライベート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
を返します
これは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
}
}
あなたはあなたのデバイスが触覚振動効果をサポートしているかどうかを以下のコードで知っています、
UIDevice.currentDevice().valueForKey("_feedbackSupportLevel");
これらのメソッドは以下を返すようです:
=タプティックは使用できません
1 =第1世代(iPhone 6sでテスト済み)... UINotificationFeedbackGeneratorなどをサポートしていません
触覚フィードバックを備えたデバイスに対しては2を返します-iPhone 7/7 +以上なので、これを使用して触覚フィードバックを簡単に生成できます