2012-08-29 22 views
10

Tengo una aplicación diseñada para ejecutarse en MacOS con y sin espacio aislado. Si un usuario se actualiza de MacOS 10.6 a un sistema operativo posterior, necesito que el usuario vuelva a seleccionar las carpetas para que pueda marcarlas con marcadores seguros.¿Cómo puedo detectar si mi aplicación está en modo de espacio aislado?

¿Cómo puedo detectar si mi aplicación está en un SO que admite sandboxing?

Respuesta

19

Lo único que sé es buscar la variable de entorno APP_SANDBOX_CONTAINER_ID. Está presente cuando la aplicación se ejecuta dentro de un contenedor de espacio aislado.

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

Exactamente estoy buscando! Lo probaré y revisaré este comentario si funciona. Gracias. – NPAssoc

+0

Nota: Esto ya no funciona en macOS Sierra (beta 1, 2 y 3 hasta el momento). – Kyle

+0

@Kyle Esto parece funcionar bien en 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

intente también explicar lo que hace su código. – loki

+0

Comprueba si existe una autorización válida "com.apple.security.app-sandbox" para el paquete de aplicaciones especificado. "Sí" significa que la aplicación es sandboxed. Información detallada de API que puede encontrar aquí https://developer.apple.com/reference/security – Oleksii

1

Prueba esto para 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 
} 
Cuestiones relacionadas