我在iPhone上遇到接近传感器问题。似乎当禁用空闲计时器并启用接近监视时,屏幕(有时)将在接收通知时打开。此后,接近状态报告错误,屏幕不会再次关闭。
我提供了一个示例项目来说明问题。但重现的步骤非常简单。我在多个iOS版本(7.0.3和8.3)的多部手机(4S,5,6,6 +)上进行了测试。当手机未连接电源或调试器时,它似乎最可靠。
我唯一的ViewController中的代码是(视图在故事板中创建):
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var checkingToggleButton: UIButton!
@IBOutlet weak var debugLabel: UILabel!
@IBOutlet weak var screenDebugLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.checkingToggleButton.setTitle("Start checking", forState: UIControlState.Normal)
self.debugLabel.text = "Not checking"
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("proximityChanged:"), name: "UIDeviceProximityStateDidChangeNotification", object: nil)
}
@IBAction func handleCheckingToggle(sender: AnyObject) {
let enabled = !UIDevice.currentDevice().proximityMonitoringEnabled
if enabled {
self.debugLabel.text = "Checking"
self.checkingToggleButton.setTitle("Stop checking", forState: UIControlState.Normal)
} else {
self.debugLabel.text = "Not checking"
self.checkingToggleButton.setTitle("Start checking", forState: UIControlState.Normal)
}
UIApplication.sharedApplication().idleTimerDisabled = enabled
UIDevice.currentDevice().proximityMonitoringEnabled = enabled
}
func proximityChanged(notification:NSNotification)
{
if UIDevice.currentDevice().proximityState{
self.screenDebugLabel.text = "Proximity true"
println("Proximity true")
} else {
self.screenDebugLabel.text = "Proximity false"
println("Proximity false")
}
}
}
重现的步骤:
屏幕将亮起并再次无法关闭。我们还创建了一个标签,显示当前的proximityState,状态(错误地)报告为false。
链接到GitHub上的示例项目: https://github.com/TimPelgrim/ProximityTest
答案 0 :(得分:0)
我向苹果工程师发送了技术支持问题,他们告诉我这是操作系统中的一个错误。没有关于何时修复的报告,但是被告知这个问题似乎发生在(至少)iOS 7和8的所有版本中,并且似乎没有解决方法。如果我收到修复通知,我会在这里更新。
答案 1 :(得分:0)
实际上有解决方法..
UIDevice.current.proximityState
正在改变,因为它应该改变。但问题在于UIDeviceProximityStateDidChange
通知。
因此,解决方法是创建计时器,检查UIDevice.current.proximityState
是否发生了变化,每隔x次检查一次。只是不要使用UIDeviceProximityStateDidChange
。
答案 2 :(得分:0)
我已经用Notification方法测试了很多东西。 正如Asi提到的那样,它不能很好地工作。解决方案是观察变量。
此问题在iOS 11.4.1中仍然存在(尚未在iOS 12 Beta中进行测试)。
快捷键4 :
// Prepare you observer variable
private var observer: NSKeyValueObservation?
// ...
// Start observing proximityState
self.observer = UIDevice.current.observe(\.proximityState) { [weak self] (device, _) in
print("State changed: \("device.proximityState")")
}
// ...
// Don't forget to call the `invalidate` method on your observer when you want to stop observing
self.observer?.invalidate()