我在我的appdelegate的applicationDidFinishLaunching:方法中使用它来确保iPhone在应用程序打开期间不会进入睡眠状态
[application setIdleTimerDisabled:YES];
它适用于所有屏幕,但在其中一个屏幕上,iPhone会进入睡眠状态。我无法弄清楚如何重现这一点,它似乎随机发生。
有人可以告诉我如何处理这种情况。
由于
答案 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;
有趣的黑客,但它有效
答案 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)
- (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是解决问题的最佳方法。