我想知道我们如何检查当前设备上是否有新的iOS 10 API UIFeebackGenerator
。还有一些我们需要检查的事情:
前两个检查可以使用#available(iOS 10, *)
语句和(hacky)设备检测来实现,但后者似乎不可检查。
有人知道这方面的解决方案吗?或许我们需要为此提交Apple Radar。谢谢!
答案 0 :(得分:13)
有一些没有证件的私人物品":
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/ 强>
答案 1 :(得分:6)
基于Apple's UIFeedbackGenerator
documentation,听起来像iOS就是这样。
请注意,调用这些方法不会直接播放触觉。 相反,它会通知系统事件。 系统然后 决定是否根据设备播放触觉, 应用程序的状态,剩余的电池电量等 因素。
例如,目前仅播放触觉反馈:
在支持Taptic Engine的设备上(iPhone 7和iPhone 7 加)。
当应用程序在前台运行时。
启用系统触觉设置时。
即使您不需要担心检查设备是否可以进行触觉反馈,您仍然需要确保它仅在iOS 10或更高版本中被调用,因此您可以通过以下方式实现此目的:
if #available(iOS 10,*) {
// your haptic feedback method
}
此处有{10}在iOS 10中可用。
答案 2 :(得分:5)
在iOS 13上,您可以非常直接地对其进行检查。在this文档页面之后,您要做的就是:
var supportsHaptics: Bool = false
...
// Check if the device supports haptics.
let hapticCapability = CHHapticEngine.capabilitiesForHardware()
supportsHaptics = hapticCapability.supportsHaptics
答案 3 :(得分:2)
我不使用私有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
答案 4 :(得分:1)
您知道您的设备是否支持触觉振动效果,代码如下,
df1.assign(Index=df1.index // 3).pivot('Index', 'Name', 'Value')
Name classe code series
Index
0 12 10 B
1 1 12 C
2 18 16 A
这些方法似乎回归:
0 =没有Taptic
1 =第一代(在iPhone 6s上测试过)......没有 支持UINotificationFeedbackGenerator等
对于具有触觉反馈的设备,它会返回2 - iPhone 7/7 +或更高版本,因此,您可以轻松地使用它来生成触觉反馈
答案 5 :(得分:1)
这将适用于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
}
}