2017-08-05 3 views
5

Je cherche un moyen de déterminer quand Night Shift a été activé ou désactivé et d'effectuer une action basée sur cela. J'utilise actuellement l'en-tête CBBlueLightClient dans l'infrastructure CoreBrightness pour contrôler Night Shift. Voici un en-tête partielle J'utilise dans mon application:Comment puis-je observer les changements de Night Shift sur macOS/iOS?

@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 dispose également d'un bloc de notification, - (void)setStatusNotificationBlock:(id /* block */)arg1; que je ne peux pas comprendre comment utiliser. Tout ce que j'ai essayé fonctionne avec macOS, y compris le bloc de notification qui semble être là. Je n'arrive tout simplement pas à comprendre quel genre de fermeture il attend.

+0

Je doute d'Apple exposera quelque chose comme ça depuis presque changement affecte le système dans son ensemble. Ils ne voudraient pas que les développeurs modifient l'affichage de leur application lorsque cela se produit. J'aimerais voir s'il y a une option si. – adev

+0

@adev Je ne m'attendais pas à ce qu'Apple fasse quelque chose comme ça facile à trouver mais j'espère que c'est encore possible. – Nate

+0

Pas facile à trouver signifie normalement une api privée. Donc, si vous le trouvez, vous ne pouvez pas l'utiliser dans votre application de toute façon (si vous voulez votre application sur l'App Store) – Fogmeister

Répondre

4

Vous pouvez simplement créer un bloc de notification void, et il se déclenche lorsque le décalage de nuit est activé/désactivé et lorsque les paramètres de décalage de nuit sont changés. À l'intérieur du bloc de notification, vous pouvez demander si le poste de nuit est activé ou désactivé.

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

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

[client setStatusNotificationBlock:notificationBlock]; 

Il semble que le changement de force ne déclenche pas de notification. Vous pourriez interroger pour cela si vous en avez besoin? Cela dépend vraiment de votre cas d'utilisation.

Si vous voulez juste savoir quand il a été basculé, abonnez la notification comme ci-dessus et vérifiez la propriété .enabled.

L'en-tête J'utilise:

@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 
0

Avez-vous essayé d'autres API?

CCUINightShiftSectionController

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

CFCBSetNightShiftMode

+0

Aucun de ces en-têtes n'a de bloc de notification. J'ai déjà implémenté l'obtention et le réglage de l'état de Night Shift.Je cherche à obtenir des notifications du système lorsque Night Shift est basculé en dehors de mon application. – Nate