我想知道我们如何检查新的 iOS 10 APIUIFeebackGenerator
在当前设备上是否可用。还有一些我们需要检查的东西:
- 设备需要运行 iOS 10.0 或更高版本
- 设备需要是 iPhone 7 或更高版本
- 触觉引擎需要在设置中打开
前两项检查可以使用#available(iOS 10, *)
语句和(hacky)设备检测来实现,但后一项似乎不可检查。
有人知道解决方案吗?或者,也许我们需要为此提交一份 Apple Radar。谢谢!
我想知道我们如何检查新的 iOS 10 APIUIFeebackGenerator
在当前设备上是否可用。还有一些我们需要检查的东西:
前两项检查可以使用#available(iOS 10, *)
语句和(hacky)设备检测来实现,但后一项似乎不可检查。
有人知道解决方案吗?或者,也许我们需要为此提交一份 Apple Radar。谢谢!
有一些无证的“私人事物”:
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/
根据Apple 的UIFeedbackGenerator
文档,听起来 iOS 会为您做到这一点。
请注意,调用这些方法不会直接播放触觉。相反,它会将事件通知系统。然后系统根据设备、应用程序的状态、剩余电池电量和其他因素确定是否播放触觉。
例如,目前仅播放触觉反馈:
在支持 Taptic Engine 的设备上(iPhone 7 和 iPhone 7 Plus)。
当应用程序在前台运行时。
启用系统触觉设置时。
即使您不需要担心检查设备是否可以进行触觉反馈,您仍然需要确保仅在 iOS 10 或更高版本中调用它,因此您可以通过以下方式完成:
if #available(iOS 10,*) {
// your haptic feedback method
}
以下是iOS 10 中可用的各种触觉反馈选项的快速摘要。
从iOS 13开始,您可以通过非常简单的方式对其进行检查。根据文档页面,您所要做的就是:
import CoreHaptics
var supportsHaptics: Bool = false
...
// Check if the device supports haptics.
let hapticCapability = CHHapticEngine.capabilitiesForHardware()
supportsHaptics = hapticCapability.supportsHaptics
我在UIDevice
不使用私有 API的情况下进行了扩展
extension UIDevice {
static var isHapticsSupported : Bool {
let feedback = UIImpactFeedbackGenerator(style: .heavy)
feedback.prepare()
return feedback.description.hasSuffix("Heavy>")
}
}
你像这样使用它:
UIDevice.isHapticsSupported
返回true
或false
您知道您的设备是否支持触觉振动效果,请使用以下代码,
UIDevice.currentDevice().valueForKey("_feedbackSupportLevel");
这些方法似乎返回:
0 = Taptic 不可用
1 = 第一代(在 iPhone 6s 上测试)...不支持 UINotificationFeedbackGenerator 等。
它为具有触觉反馈的设备返回 2 - iPhone 7/7+ 或更高版本,因此,您可以轻松地使用它来生成触觉反馈
这适用于 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
}
}