Как я могу наблюдать изменения в Night Shift на macOS / iOS?
Я ищу способ определить, когда Night Shift был включен или отключен, и выполнить действие, основанное на этом. В настоящее время я использую заголовок CBBlueLightClient в платформе CoreBrightness для управления Night Shift. Вот частичный заголовок, который я использую в своем приложении:
@interface CBBlueLightClient : NSObject
- (BOOL)setStrength:(float)strength commit:(BOOL)commit;
- (BOOL)setEnabled:(BOOL)enabled;
- (BOOL)getStrength:(float*)strength;
- (BOOL)getBlueLightStatus:(struct { BOOL x1; BOOL x2; BOOL x3; int x4; struct { struct { int x_1_2_1; int x_1_2_2; } x_5_1_1; struct {
int x_2_2_1; int x_2_2_2; } x_5_1_2; } x5; unsigned long x6; }*)arg1;
@end
CBBlueLightClient также имеет блок уведомлений, -
(void)setStatusNotificationBlock:(id /* block */)arg1;
который я не могу понять, как использовать.
Вот полный заголовок для iOS. Все, что я пробовал, работает с macOS, включая блок уведомлений, который, кажется, там есть. Я просто не могу понять, какого закрытия он ожидает.
2 ответа
Вы можете просто создать void
блок уведомлений, и он будет срабатывать при включении / отключении ночной смены и при изменении настроек ночной смены. Внутри блока уведомлений вы можете узнать, включена ли ночная смена или нет.
CBBlueLightClient *client = [[CBBlueLightClient alloc] init];
void (^notificationBlock)() = ^() {
StatusData status;
[client getBlueLightStatus:&status];
//... check status.enabled, status.active, etc);
};
[client setStatusNotificationBlock:notificationBlock];
Кажется, что изменение силы не запускает уведомление. Вы могли бы опросить об этом, если вам нужно? Это действительно зависит от вашего варианта использования.
Если вы просто хотите узнать, когда он был переключен, подпишитесь на уведомление, как указано выше, и проверьте .enabled
имущество.
Заголовок, который я использую:
@interface CBBlueLightClient : NSObject
typedef struct {
int hour;
int minute;
} Time;
typedef struct {
Time fromTime;
Time toTime;
} Schedule;
typedef struct {
BOOL active;
BOOL enabled;
BOOL sunSchedulePermitted;
int mode;
Schedule schedule;
unsigned long long disableFlags;
} StatusData;
- (void)setStatusNotificationBlock:(id /* block */)arg1;
- (BOOL)getBlueLightStatus:(StatusData *)arg1;
@end
Вы пробовали другие API?
CCUINightShiftSectionController
(void)_getBlueLightStatus:(id /* block */)arg1;
(void)_setNightShiftEnabled:(BOOL)arg1;