2011-02-10 18 views
5

Vorrei svegliare un Mac a livello di programmazione. Ho iniziato utilizzando IOPMSchedulePowerEvent, tuttavia, quel metodo richiede l'accesso di amministratore e gli helper privilegiati. Ho implementato e funziona ma è troppo complicato.Come programmare la sveglia del sistema utilizzando le preferenze di sistema su un Mac?

Ho cercato un approccio migliore e ho scoperto che è possibile pianificare l'attivazione del sistema andando su Preferenze di Sistema -> Risparmio Energia -> Pianificazione. C'è un modo per pianificare in modo programmato un orario di attivazione usando questo metodo?

Grazie.

Modifica: capisco che il sistema richiede l'accesso di amministratore per pianificare l'attivazione del sistema e il tempo di sospensione. Va bene. Mi piacerebbe essere in grado di farlo a livello di programmazione. Se l'utente autorizza la funzionalità è ok, a condizione che venga richiesto una sola volta. Le richieste successive di impostare il tempo di attivazione del sistema non dovrebbero richiedere l'autorizzazione dell'utente.

risposta

2

Utilizzare IOPMSchedulePowerEvent è la cosa giusta da fare. Tuttavia, se si crea uno strumento di supporto privilegiato, è sufficiente richiedere all'utente una sola volta per la propria password. Il codice BetterAuthorizationSample di Apple fornisce un esempio di come farlo; c'è anche una modifica di terze parti, AuthorizedTasksInCocoa, che potrebbe essere un po 'più facile da usare (non l'ho provato).

+0

@Nicholas, ho già implementato un helper con BAS, tuttavia BAS usa launchd per eseguire l'helper. In tal modo, launchd richiede che il daemon helper sia installato in/Library/LaunchDaemons. Questo è il modo approvato da Apple, ma per il Mac App Store, a Apple non piace perché rompe una delle loro regole sull'ubicazione del file dell'applicazione di file. – David

+1

Sì, non è possibile farlo se si desidera inviare al Mac App Store. Questo è di progettazione e non c'è modo di aggirarlo.Segnala un bug ad Apple se questo è un problema per te e forse, un giorno, cambieranno le regole. (Altre applicazioni che usano l'autorizzazione hanno versioni separate per il Mac App Store che rimuovono la funzionalità di autorizzazione.) –

+0

Beh, so che svegliare il sistema dal sonno è possibile perché ci sono applicazioni di allarme nel negozio che lo fa (es. Aurora). L'applicazione Aurora richiede un'autenticazione dell'amministratore e utilizza uno strumento di supporto per riattivare il sistema dalla modalità sospensione. Non capisco come possano ottenere un modo per non utilizzare launchd. – David

0

Sono abbastanza sicuro che questo è destinato a richiedere l'accesso di amministratore. Ad esempio, le opzioni in Preferenze di Sistema -> Risparmio Energia -> Pianificazione non sono disponibili a meno che tu non abbia effettuato l'accesso come amministratore o che tu abbia eseguito l'autenticazione a Preferenze di Sistema come amministratore. Se hai trovato un modo per farlo senza privilegi speciali, mi aspetterei che Apple lo consideri un bug di sicurezza e lo risolva (rompendo così il tuo programma).

+0

ok è richiesto l'accesso di amministratore ma si conosce un modo per accedere in modo programmatico al sistema di sospensione e all'attivazione dello scheduler? – David

1

Non ho una risposta completa per te, ma questo dovrebbe aiutare immensamente: http://www.opensource.apple.com/source/PowerManagement/PowerManagement-211/pmset/pmset.c

Che cosa si vorrà fare è pianificare una kIOPMAutoWake. Trova quella costante (non una sua variazione) nel codice e inizia a leggere. Non è così a lungo.

Probabilmente si può anche usare direttamente pmset, ma sarebbe piuttosto poco elegante.

Per quanto riguarda l'elevazione, Apple ne parla in Secure Coding Guide.

0

È possibile pianificare gli eventi di attivazione con IOPMSchedulePowerEvent tramite Power Manager. Potresti essere in grado di programmare un risveglio immediato. pmset è un wrapper della riga di comando per il power manager. Puoi anche evitare di dormire con IOCancelPowerChange in alcuni casi.

Potrebbe essere possibile impedire la sospensione o il risveglio generando un mouse o un evento chiave. Un modo per generare eventi è con CGPostKeyboardEvent.

==> Il sonno normale è diverso dal sonno chiuso a conchiglia. Per influenzare quest'ultimo è necessario scrivere un'estensione del kernel come Insomnia.

Problemi correlati