我正在寻找一种确定何时启用或禁用Night Shift并根据其执行操作的方法。我目前在CoreBrightness框架中使用CBBlueLightClient标头来控制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;
,我不知道如何使用。Here's the full header for iOS.我尝试过的所有东西都可以在macOS上运行,包括似乎存在的通知块。我只是不知道它期望什么样的关闭。
最佳答案
您可以只创建一个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