2012-08-29 7 views
10

Ich habe eine Anwendung, die in Sandboxed und nicht Sandboxed MacOS ausgeführt werden soll. Wenn ein Benutzer von MacOS 10.6 auf ein neueres Betriebssystem upgradet, muss der Benutzer Ordner erneut auswählen, damit ich sie mit sicheren Lesezeichen markieren kann.Wie erkenne ich, ob meine App Sandboxed ist?

Wie erkenne ich, dass meine Anwendung auf einem Betriebssystem läuft, das Sandboxing unterstützt?

Antwort

19

Die einzige Möglichkeit, die ich kenne, ist nach APP_SANDBOX_CONTAINER_ID Umgebungsvariablen zu suchen. Es ist vorhanden, wenn die App in einem Sandbox-Container ausgeführt wird.

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

ich suche Genau! Ich werde es versuchen und diesen Kommentar überarbeiten, wenn es funktioniert. Vielen Dank. – NPAssoc

+0

Hinweis: Dies funktioniert nicht mehr auf macOS Sierra (bisher 1, 2 & 3). – Kyle

+0

@Kyle Dies scheint in High Sierra gut zu funktionieren. – 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

Bitte versuchen Sie auch zu erklären, was Ihr Code tut. – loki

+0

Es prüft, ob eine gültige Berechtigung "com.apple.security.app-sandbox" für das angegebene Anwendungs-Bundle existiert. "Ja" bedeutet, dass die Anwendung Sandboxed ist. Detaillierte API-Informationen finden Sie hier https://developer.apple.com/reference/security – Oleksii

1

Testing dies für 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 
} 
Verwandte Themen