2014-06-06 11 views
5

Questa è la mia prima volta che scrivo in Swift, Cocoa (ho esperienza in Cocoa Touch) e uso Autorizzazione, quindi onestamente non ho idea se sono sulla buona strada. Sto cercando di apportare una modifica al file hosts, che richiede l'autenticazione dell'utente, ma entrambi i metodi AuthorizationCreate e AuthorizationExecuteWithPrivileges danno errori.Autorizzazione al cacao in Swift

var authorizationRef:AuthorizationRef 
var status:OSStatus 
status = AuthorizationCreate(nil, environment:kAuthorizationEmptyEnvironment, flags:kAuthorizationFlagDefaults, authorization:&authorizationRef) 
let overwrite_hosts = "echo \(hostsContents) > /private/etc/hosts" 
let args = [overwrite_hosts.cStringUsingEncoding(NSUTF8StringEncoding)] 
status = AuthorizationExecuteWithPrivileges(authorizationRef, pathToTool:"/bin/sh", options:kAuthorizationFlagDefaults, arguments:args, communicationsPipe:nil) 

chiamarmi AuthorizationCreate sta gettando "Tipo '()' non è conforme al protocollo 'AuthorizationRef'" e il mio richiamo della AuthorizationExecuteWithPrivileges sta gettando "Impossibile trovare un sovraccarico per '__conversion' che accetta gli argomenti forniti"

Qualche idea? Mi sto avvicinando in modo errato?

Grazie per qualsiasi aiuto!

+0

Si scopre che non sei implemeting i metodi AuthorizationRef protocollo che si deve attuare. Vai alla sua implementazione con cmd + cliking in esso, cerca qualsiasi cosa non contenga @optional e implementala. –

risposta

1

Sono stato in grado di capire come farlo tramite AppleScript, ma dovresti essere in grado di farlo usando il metodo di autorizzazione che stavo provando prima, lasciando quindi aperta questa domanda. Qualcuno alla ricerca di una soluzione rapida (no assegni errore implementate) è possibile utilizzare quello che ho scritto qui di seguito:

func doScriptWithAdmin(inScript:String) -> String{ 
    let script = "do shell script \"\(inScript)\" with administrator privileges" 
    var appleScript = NSAppleScript(source: script) 
    var eventResult = appleScript.executeAndReturnError(nil) 
    if !eventResult { 
     return "ERROR" 
    }else{ 
     return eventResult.stringValue 
    } 
}