收到通知后,接近状态不会发生变化

时间:2015-06-19 10:13:11

标签: ios iphone swift

我在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")
        }
    }
}

重现的步骤:

  1. 在设备上构建提供的示例项目,并在断开电源和调试器的设备上运行应用程序(这似乎有所不同)。
  2. 按下"开始检查"启用proximityMonitoring并禁用空闲计时器。按钮。
  3. 盖住接近传感器,关闭屏幕。
  4. 等待大约2分钟(这也有所不同,做得太快不会重现问题)
  5. 向自己发送通知(例如iMessage)
  6. 屏幕将亮起并再次无法关闭。我们还创建了一个标签,显示当前的proximityState,状态(错误地)报告为false。

    链接到GitHub上的示例项目: https://github.com/TimPelgrim/ProximityTest

3 个答案:

答案 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()