我如何观察 macOS / iOS 上 Night Shift 的变化?

How can I observe changes to Night Shift on macOS / iOS?

我正在寻找一种方法来确定何时启用或禁用 Night Shift 并根据该方法执行操作。我目前在 CoreBrightness 框架中使用 CBBlueLightClient header 来控制 Night Shift。这是我在我的应用程序中使用的部分 header:

@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,包括似乎存在的通知块。我只是不知道它期望什么样的关闭。

您是否尝试过其他 API?

CCUINightShiftSectionController

 (void)_getBlueLightStatus:(id /* block */)arg1;
 (void)_setNightShiftEnabled:(BOOL)arg1;

CFCBSetNightShiftMode

您可以只创建一个 void 通知块,它会在启用/禁用夜班以及更改夜班设置时触发。在通知栏中可以查询夜班是否开启。

CBBlueLightClient *client = [[CBBlueLightClient alloc] init];

void (^notificationBlock)() = ^() {
    StatusData status;
    [client getBlueLightStatus:&status];
    //... check status.enabled, status.active, etc);
};

[client setStatusNotificationBlock:notificationBlock];

强度变化似乎没有触发通知。如果需要,您可以投票吗?这实际上取决于您的用例。

如果您只是想知道它何时被切换,请按上述方式订阅通知并查看 .enabled 属性.

我正在使用的header:

@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