2012-08-29 22 views
10

Mam aplikację, która jest przeznaczona do uruchamiania w MacOS z piaskownicą i bez piaskownicy. Jeśli użytkownik uaktualnia system Mac OS w wersji 10.6 do nowszego systemu operacyjnego, potrzebuję, aby użytkownik ponownie wybrał foldery, aby utworzyć zakładkę z bezpiecznymi zakładkami.Jak wykryć, czy moja aplikacja jest piaskownica?

Jak wykryć, że moja aplikacja działa w systemie operacyjnym obsługującym sandboxing?

Odpowiedz

19

Jedynym sposobem, jaki znam, jest wyszukanie zmiennej środowiskowej APP_SANDBOX_CONTAINER_ID. Jest obecny, gdy aplikacja działa w kontenerze piaskownicy.

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

Dokładnie szukam! Spróbuję i poprawię ten komentarz, jeśli zadziała. Dzięki. – NPAssoc

+0

Uwaga: to nie działa już w systemie MacOS Sierra (wersja beta 1, 2 i 3). – Kyle

+0

@Kyle To wydaje się działać dobrze na 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

spróbuj także wyjaśnić, co robi Twój kod. – loki

+0

Sprawdza, czy istnieje uprawnienie "com.apple.security.app-sandbox" dla określonego pakietu aplikacji. "Tak" oznacza, że ​​aplikacja jest piaskowana. Szczegółowe informacje o interfejsie API można znaleźć tutaj https://developer.apple.com/reference/security – Oleksii

1

Testowanie to dla 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 
} 
Powiązane problemy