iPhone - 即使idleTimerDisabled为YES,手机也会进入睡眠状态

时间:2009-11-05 11:02:16

标签: iphone

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

[application setIdleTimerDisabled:YES];

它适用于所有屏幕,但在其中一个屏幕上,iPhone会进入睡眠状态。我无法弄清楚如何重现这一点,它似乎随机发生。

有人可以告诉我如何处理这种情况。

由于

9 个答案:

答案 0 :(得分:11)

值得庆幸的是,这个问题是5年前发布的,Xcode从那时起取得了突飞猛进的进展。

然而......使用Xcode 6.2和iOS 8.2,这个bug在2015年仍然存在并且还在继续。

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

(抓啤酒,这很痛苦。)

当我的应用首次在设备上运行时,它会从Web服务加载一堆数据。但是,如果运行时间太长,屏幕会褪色,然后关闭,设备会锁定,我的网页请求会以丑陋的“网络连接丢失”错误终止。< / p>

我尝试添加代码以简单地设置/取消设置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];
}

真的,Apple?

2015年,Xcode 真的仍然很糟糕......?

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

答案 1 :(得分:10)

我使用以下方法在我的应用中设置和取消设置此属性:

[UIApplication sharedApplication].idleTimerDisabled = YES;

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

答案 2 :(得分:9)

尝试使用

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

而不是

[UIApplication sharedApplication].idleTimerDisabled = YES;

有趣的黑客,但它有效

另见线程idleTimerDisabled not working since iPhone 3.0

答案 3 :(得分:5)

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

答案 4 :(得分:3)

最好在特定的视图控制器中使用它而不是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
}

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

我遇到了类似的问题,重新启动手机修复了它。我找不到它的程序化修复,因为即使是在一秒间隔内调用idleTimerDisabled函数的计时器也没有修复它。

答案 7 :(得分:1)

我有同样的问题。我需要让屏幕变暗,但是当关闭相机时,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];

答案 8 :(得分:-3)

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

使用dot accessor是解决问题的最佳方法。