2012-08-29 2 views
10

Possiedo un'applicazione destinata all'esecuzione in macOS sia in modalità sandbox che non in modalità sandbox. Se un utente esegue l'aggiornamento da MacOS 10.6 a un sistema operativo successivo, ho bisogno che l'utente selezioni nuovamente le cartelle in modo da poterli aggiungere ai segnalibri protetti.Come posso rilevare se la mia app è in modalità sandbox?

Come si rileva che la mia applicazione si trova su un sistema operativo che supporta il sandboxing?

risposta

19

L'unico modo che conosco è cercare la variabile di ambiente APP_SANDBOX_CONTAINER_ID. È presente quando l'app è in esecuzione all'interno di un contenitore sandbox.

NSDictionary* environ = [[NSProcessInfo processInfo] environment]; 
BOOL inSandbox = (nil != [environ objectForKey:@"APP_SANDBOX_CONTAINER_ID"]); 
+0

Esattamente sto cercando! Farò un tentativo e rivedere questo commento se funziona. Grazie. – NPAssoc

+0

Nota: questo non funziona più su macOS Sierra (beta 1, 2 e 3 finora). – Kyle

+0

@Kyle Sembra funzionare bene su High Sierra. – Gino

2
BOOL isSandboxed = NO; 

SecStaticCodeRef staticCode = NULL; 
NSURL *bundleURL = [[NSBundle mainBundle] bundleURL]; 

if (SecStaticCodeCreateWithPath((__bridge CFURLRef)bundleURL, kSecCSDefaultFlags, &staticCode) == errSecSuccess) { 
    if (SecStaticCodeCheckValidityWithErrors(staticCode, kSecCSBasicValidateOnly, NULL, NULL) == errSecSuccess) { 
     SecRequirementRef sandboxRequirement; 
     if (SecRequirementCreateWithString(CFSTR("entitlement[\"com.apple.security.app-sandbox\"] exists"), kSecCSDefaultFlags, 
             &sandboxRequirement) == errSecSuccess) 
     { 
      OSStatus codeCheckResult = SecStaticCodeCheckValidityWithErrors(staticCode, kSecCSBasicValidateOnly, sandboxRequirement, NULL); 
      if (codeCheckResult == errSecSuccess) { 
       isSandboxed = YES; 
      } 
     } 
    } 
    CFRelease(staticCode); 
} 
+1

prova anche a spiegare cosa fa il tuo codice. – loki

+0

Controlla l'autorizzazione valida "com.apple.security.app-sandbox" esistente per il pacchetto di applicazioni specificato. "Sì" significa che l'applicazione è in modalità sandbox. Informazioni dettagliate sull'API che puoi trovare qui https://developer.apple.com/reference/security – Oleksii

1

Testing questo per Swift3

func isSandboxed() -> Bool { 
    let bundleURL = Bundle.main.bundleURL 
    var staticCode:SecStaticCode? 
    var isSandboxed:Bool = false 
    let kSecCSDefaultFlags:SecCSFlags = SecCSFlags(rawValue: SecCSFlags.RawValue(0)) 

    if SecStaticCodeCreateWithPath(bundleURL as CFURL, kSecCSDefaultFlags, &staticCode) == errSecSuccess { 
     if SecStaticCodeCheckValidityWithErrors(staticCode!, SecCSFlags(rawValue: kSecCSBasicValidateOnly), nil, nil) == errSecSuccess { 
      let appSandbox = "entitlement[\"com.apple.security.app-sandbox\"] exists" 
      var sandboxRequirement:SecRequirement? 

      if SecRequirementCreateWithString(appSandbox as CFString, kSecCSDefaultFlags, &sandboxRequirement) == errSecSuccess { 
       let codeCheckResult:OSStatus = SecStaticCodeCheckValidityWithErrors(staticCode!, SecCSFlags(rawValue: kSecCSBasicValidateOnly), sandboxRequirement, nil) 
       if (codeCheckResult == errSecSuccess) { 
        isSandboxed = true 
       } 
      } 
     } 
    } 
    return isSandboxed 
}