mio cacao app funziona operazioni in background, che vorrei fermare quando l'utente diventa inattivo (senza tastiera/input del mouse) e poi riprendere quando l'utente diventa di nuovo attivo. C'è un modo per registrarsi per le notifiche di stato inattivo?Objective C: Ricevi notifiche sullo stato di inattività di un utente
risposta
Nel caso in cui non è possibile collegare al carbonio (. Per esempio, si desidera compilare po x86_64 binario) si può avvolgere questa funzione (che restituisce ore di inattività nella risoluzione secondi, come doppio - CFTimeInterval) in un timer:
#include <IOKit/IOKitLib.h>
CFTimeInterval CFDateGetIdleTimeInterval() {
mach_port_t port;
io_iterator_t iter;
CFTypeRef value = kCFNull;
uint64_t idle = 0;
CFMutableDictionaryRef properties = NULL;
io_registry_entry_t entry;
IOMasterPort(MACH_PORT_NULL, &port);
IOServiceGetMatchingServices(port, IOServiceMatching("IOHIDSystem"), &iter);
if (iter) {
if ((entry = IOIteratorNext(iter))) {
if (IORegistryEntryCreateCFProperties(entry, &properties, kCFAllocatorDefault, 0) == KERN_SUCCESS && properties) {
if (CFDictionaryGetValueIfPresent(properties, CFSTR("HIDIdleTime"), &value)) {
if (CFGetTypeID(value) == CFDataGetTypeID()) {
CFDataGetBytes(value, CFRangeMake(0, sizeof(idle)), (UInt8 *) &idle);
} else if (CFGetTypeID(value) == CFNumberGetTypeID()) {
CFNumberGetValue(value, kCFNumberSInt64Type, &idle);
}
}
CFRelease(properties);
}
IOObjectRelease(entry);
}
IOObjectRelease(iter);
}
return idle/1000000000.0;
}
sarà necessario collegare il codice per IOKit.framework
Apple Technical Q&A QA1340 Registering and unregistering for sleep and wake notifications può essere quello che stai cercando.
Se è necessario un controllo maggiore di NSWorkspaceWillSleepNotification (Elenco 1), utilizzare I/O Kit e registrarsi per ricevere le notifiche di alimentazione (Elenco 3).
Il problema con le notifiche a seconda sonno/veglia è che se un utente imposta le proprie impostazioni di sonno a "mai" non saranno mai inviati. Mi piacerebbe contare il tempo di inattività quando non ci sono attività da tastiera/mouse. – David
Ci scusiamo, anche se intendevi quando l'app entra nel sonno ideale. La soluzione di kperryua con CGEventSourceSecondsSinceLastEventType è corretta per il monitoraggio del tempo dall'ultimo input dell'utente. –
C'è una API Carbon che invierà una notifica quando non c'è stato un evento utente dopo una certa durata chiamata EventLoopIdleTimer
. Uli Kusterer ha scritto un wrapper Cocoa per here (look for UKIdleTimer).
Se si desidera qualcosa di livello inferiore, è possibile implementare il comportamento desiderato con una combinazione di timer e la funzione CoreGraphics CGEventSourceSecondsSinceLastEventType
(disponibile in <CoreGraphics/CGEventSource.h>
).
ho usato un approccio diverso. Applicazione sottoclasse UIA I override del tocco del metodo sendEvent tocchi (in realtà è possibile filtrare qualsiasi tipo di evento, accelerazione, tocco, ecc.). Utilizzando una variabile condivisa e un timer dello sfondo ho gestito il "idle". Ogni volta che l'utente tocca lo schermo, la variabile viene impostata con timeInterval corrente (ora corrente). I timer metodo fuoco i controlli per il tempo trascorso dall'ultima tocco, se superiore alla soglia (nel mio caso è stato di circa 90 secondi) si possono inviare la propria notifica.
Ho usato questo metodo semplice per creare un set personalizzato di applicazioni che dopo un certo tempo di inattività chiamano automaticamente il "screensaver" app.
Niente intelligente, semplicemente fare il lavoro.
Spero che questo aiuti.
- 1. Ricevi notifiche correnti android
- 2. Objective C - Ricevi un avviso quando un metodo viene chiamato
- 3. Ricevi notifiche quando DTE.ActiveDocument cambia
- 4. Ricevi notifiche sulle immagini trascinate all'interno di un divento contentedabile
- 5. Ricevi notifiche quando l'utente carica su un bucket S3?
- 6. Ricevi notifiche sulla modifica dell'interfaccia di rete su Linux
- 7. Ricevi notifiche sulla modifica di una pagina in UIWebView
- 8. Ricevi notifiche quando un file cambia su dropbox
- 9. Ricevi i post di un utente su Facebook?
- 10. Come visualizzare le notifiche Android sullo schermo e l'icona della barra di stato?
- 11. Server utente GoogleAuthCode nil in Objective-C
- 12. Tempo di inattività applicazione
- 13. Logica di proprietà Objective-C
- 14. Ricevi notifiche per i documenti modificati in mongodb
- 15. Ricevi notifiche push di Gmail solo quando arriva un nuovo messaggio
- 16. Ricevi notifiche push Android anche se l'app è chiusa
- 17. Creazione di un TTF in Objective-C
- 18. WPF: tempo di inattività applicazione
- 19. Ottenere inattività/tempo di inattività in un'applicazione WPF
- 20. Creazione di un file di database SQLite3 tramite Objective-C
- 21. VB Detect Tempo di inattività
- 22. Notifiche utente - Come recuperare un notification_id perso da GCM?
- 23. Notifiche push in background iOS non ricevute dopo 2-3 ore di inattività
- 24. Standard di codifica Objective-C?
- 25. Versione Objective C di explode()?
- 26. Gestore di callback Objective-C
- 27. stringa di Objective-C formattazione
- 28. Un messaggio Objective-C è stato inviato a un oggetto deallocated (zombie) all'indirizzo: 0x75d52a0
- 29. Esistono file di registro sullo stato di Windows Services?
- 30. Salva nome utente e Pass Objective C iPhone
Piccola modifica, voce = IOIteratorNext (livello) deve essere voce = IOIteratorNext (iter). – Shaun
Si noti che HIDIdleTime non è molto affidabile e restituisce sempre zero su alcuni Mac per motivi sconosciuti (probabilmente alcuni dispositivi collegati ripristinano il conteggio del tempo di inattività). –