#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
}
}
}
}