【问题标题】:iPhone - phone goes to sleep even if idleTimerDisabled is YESiPhone - 即使 isidleTimerDisabled 为 YES,手机也会进入睡眠状态
【发布时间】:2009-11-05 11:02:16
【问题描述】:

我在我的 appdelegate 的 applicationDidFinishLaunching: 方法中使用它来确保 iPhone 在应用打开期间不会进入睡眠状态

[application setIdleTimerDisabled:YES];

它在所有屏幕上都运行良好,但在其中一个屏幕上 iPhone 会进入睡眠状态。我不知道如何重现这一点,而且它似乎是随机发生的。

谁能告诉我如何处理这种情况。

谢谢

【问题讨论】:

    标签: iphone


    【解决方案1】:

    我在整个应用程序中设置和取消设置此属性:

    [UIApplication sharedApplication].idleTimerDisabled = YES;
    

    将此设置在您遇到问题的地方可以解决它,尽管它可能是一种创可贴的解决方案。

    【讨论】:

      【解决方案2】:

      谢天谢地,这个问题是 5 年前发布的,从那时起 Xcode 取得了长足的进步。

      但是...这个错误在 2015 年仍然存在,并在使用 Xcode 6.2 和 iOS 8.2 时出现。

      这是您实际需要做的,以防止您的设备进入睡眠状态。

      (喝杯啤酒,这很痛苦。)

      当我的应用第一次在设备上运行时,它会从网络服务加载一堆数据。但是,如果运行时间过长,屏幕会变暗,然后关闭,设备会锁定,并且我的 Web 请求会以丑陋的“网络连接丢失”错误而终止。

      我尝试添加代码来简单地设置/取消设置idleTimerDisabled 值,但这种更改并没有持续很长时间,并且设备会在一段时间后自动锁定。

      //  This didn't work for me  (for very long !)
      [UIApplication sharedApplication].idleTimerDisabled = NO;
      [UIApplication sharedApplication].idleTimerDisabled = YES;
      

      相反,我需要做的(郁闷的叹息..)是每 20 秒设置/取消设置一个计时器。

      在我的 .h 文件中:

      @property (strong, nonatomic) NSTimer* stayAliveTimer;
      -(void)callEveryTwentySeconds;
      

      在我的 .m 文件中:

      -(void)callEveryTwentySeconds
      {
          //  DON'T let the device go to sleep during our sync
          [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
          [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
      }
      
      -(void)loadDataFromWebService
      {
          self.stayAliveTimer = [NSTimer scheduledTimerWithTimeInterval:20.0
                                                                 target:self
                                                               selector:@selector(callEveryTwentySeconds)
                                                               userInfo:nil
                                                                repeats:YES];
      
          //  
          //  Code to call our web service in a background thread and wait
          //  for it to finish (which might take a few minutes)
          //  
      
          //  Kill off our "Stay alive" timer, and allow the device to Auto Lock whenever it wants.
          [self.stayAliveTimer invalidate];
      
          //  Give our device permission to Auto-Lock when it wants to again.
          [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
      }
      

      真的吗,苹果?

      现在是 2015 年,Xcode真的还这么糟糕...?

      我希望这段代码可以帮助其他 Xcode 受害者。

      【讨论】:

      • 它叫Xcode,这确实不是IDE的问题。正确地瞄准你的愤怒。
      • 对于我在 Xcode 名称中不正确的大写字母,我向大家道歉。我觉得很愚蠢。
      • 为什么我们需要每 20 秒设置/取消设置计时器?可能它不应该是完美的解决方案,因为我也遇到了同样的问题并想要解决它。我将idleTimerDisabled 设置为YES,但一段时间后我的屏幕变暗了。
      • 这当然不是完美的解决方案。但问题是,如果您不经常“将其设置为 YES,并将其设置为 NO”,则设备确实会进入睡眠状态。所以你需要某种循环,让你的设备保持清醒。如果你能找到更好的方法,请告诉我们!
      • idleTimerDisabled 肯定有问题。我有这些问题:在我的 5s 上,它设置为 YES,但设置为 NO 不会启用睡眠。此外,一些用户抱怨它根本无法在他们的设备上运行 - 无论如何它都会进入睡眠状态。看起来它的行为取决于设备。你用什么 iPhone?
      【解决方案3】:

      尝试使用

      [UIApplication sharedApplication].idleTimerDisabled = NO;
      [UIApplication sharedApplication].idleTimerDisabled = YES;
      

      而不是

      [UIApplication sharedApplication].idleTimerDisabled = YES;
      

      有趣的破解,但它有效

      另见线程idleTimerDisabled not working since iPhone 3.0

      【讨论】:

        【解决方案4】:

        如果您的应用程序正在使用相机,那么应用程序将在使用相机后进入睡眠状态。所以你需要在你的应用 plist 中添加UIRequiredDeviceCapabilities。您可以添加不同的设备,如图所示 here

        【讨论】:

        • 你有关于这台相机的更多信息吗?博客/文章之类的?因为我们不能真正为相机添加 UIRequiredDeviceCapabilities,因为它不是使用我们的应用程序所必需的。
        • @Buju 在我的应用程序中,我发现使用相机后idleTimer 设置被相机应用程序 覆盖。指定UIRequiredDeviceCapabilities 后问题已修复。请查看blog.manbolo.com/2012/05/02/…
        • 我们不能在从相机选择器返回后将idleTimer设置为禁用吗?我要试试。
        【解决方案5】:

        而不是 Appdelegate,最好在您希望屏幕光处于活动状态的特定视图控制器中使用它。

        Swift 5.0 版本:

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            UIApplication.shared.isIdleTimerDisabled = true
        }
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            UIApplication.shared.isIdleTimerDisabled = false
        }
        

        【讨论】:

          【解决方案6】:

          在应用程序委托的+initialize方法中设置该属性,例如:

          + (void) initialize {   
              if ([self class] == [MyAppDelegate class]) {
                  UIApplication* myApp = [UIApplication sharedApplication];
                  myApp.idleTimerDisabled = YES;
              }
          }
          

          【讨论】:

            【解决方案7】:

            我遇到了类似的问题,重启手机就解决了。我找不到针对它的编程修复,因为即使是每隔一秒调用 idleTimerDisabled 函数的计时器也无法修复它。

            【讨论】:

              【解决方案8】:

              我有同样的问题。我需要调暗屏幕,但是当关闭相机时,iphone会进入睡眠状态。

              - (void)viewWillAppear:(BOOL)animated {
                  [super viewWillAppear:animated];
                  [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
              }
              
              - (void)viewWillDisappear:(BOOL)animated {
                  [super viewWillDisappear:animated];
                  [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
              }
              

              然后我在打开/关闭相机后调用它,它可以工作。

              [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
              

              【讨论】:

                【解决方案9】:

                我认为 UIApplication 类中不存在 setIdleTimerDisabled。属性不仅搜索 set- 方法,还搜索其他类似的命名方法。

                使用点存取器是解决问题的最佳方法。

                【讨论】:

                • 如果该方法不存在,应用程序将在运行时崩溃,假设您禁用或忽略了编译器警告...
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-07-14
                • 2012-02-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-05-12
                相关资源
                最近更新 更多