idleTimerDisabled не работает с (автономным) режимом одного приложения

#ios #ios12

#iOS #ios12

Вопрос:

У нас есть приложение для киоска, которое мы используем idleTimerDisabled , чтобы экран не выключался в рабочее время и позволял ему выключаться вечером.

Я делаю это с помощью таймера, созданного в applicationDidBecomeActive методе:

 self.screenLockTimer = [NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(setupScreenLock) userInfo:nil repeats:YES];
  

 - (void)setupScreenLock {
    NSDate *currentDate = [NSDate date];
    NSDate *closingDate = [[NSCalendar currentCalendar] dateBySettingHour:17 minute:0 second:0 ofDate:currentDate options:0];
    BOOL isOpeningHours = [currentDate compare:closingDate] == NSOrderedAscending;
    [UIApplication sharedApplication].idleTimerDisabled = isOpeningHours;
}
  

Раньше это работало нормально, пока мы не начали использовать автономный режим одного приложения. Теперь экран больше не выключается по вечерам. Есть ли объяснение (и обходной путь) для этого? Я знаю, что в iOS 12 есть ошибка, из-за которой idleTimerDisabled больше не работает управляемый доступ, но я не видел отчетов о подобных проблемах с режимом одного приложения.

Комментарии:

1. На самом деле я столкнулся с идентичной проблемой. Вы когда-нибудь находили решение?

2. К сожалению, пока ничего. Я подозреваю, что это ошибка, аналогичная ошибке с idleTimerDisabled и управляемым доступом.

3. Просто немного дополнительной информации для вас. На самом деле я могу заставить таймер сна работать, если я возьму его и вызову изменение ориентации… Который по-прежнему бесполезен для приложения киоска.

Ответ №1:

Запуск собственной операции может «исправить» проблему. Я смог решить свои проблемы, используя приведенный ниже код.

Попробуйте использовать следующий код:

     [UIApplication sharedApplication].idleTimerDisabled = isOpeningHours;

    // Guided access idle timer fix
    UITextField *textField = [[UITextField alloc] init];
    [self.view addSubview:textField]; // self.view or whatever relevant view is accessible.
    [textField becomeFirstResponder];
    [textField resignFirstResponder];
    [textField removeFromSuperView];
  

Комментарии:

1. Большое спасибо, это сработало как шарм! В нашем тестировании подключение устройства к зарядному устройству также вывело устройство (скорее всего, SpringBoard) из этого «заблокированного» состояния, но, похоже, это также надежно его устраняет. На данный момент…

Ответ №2:

Наш подход заключался в сбросе таймера ожидания, который не отключается путем сброса idleTimerDisabled:

 Timer.scheduledTimer(withTimeInterval: 840, repeats: true, block: { timer in
       DispatchQueue.main.async {
             UIApplication.shared.isIdleTimerDisabled = false
             UIApplication.shared.isIdleTimerDisabled = true
       }
 })
  

Это также работает.

Ответ №3:

Это мое решение, которое, наконец, работает (оно находится в файле приложения swift):

 import SwiftUI                                                                                                                                                      
                                                                                                                                                                    
@main                                                                                                                                                               
struct TestApp: App {                                                                                                                                             
    @Environment(.scenePhase) var scenePhase                                                                                                                       
    var body: some Scene {                                                                                                                                          
        WindowGroup {                                                                                                                                               
            ContentView()                                                                                                                                           
        }.onChange(of: scenePhase) { newValue in                                                                                                                    
            if newValue == .inactive || newValue == .background {                                                                                                   
                UIApplication.shared.isIdleTimerDisabled = false                                                                                                    
            }                                                                                                                                                       
            if newValue == .active {                                                                                                                                
                UIApplication.shared.isIdleTimerDisabled = true                                                                                                     
            }                                                                                                                                                       
        }                                                                                                                                                           
    }                                                                                                                                                               
}