2012-08-29 34 views
10

Hem korumalı hem de korumalı olmayan MacOS'ta çalışması hedeflenen bir uygulamam var. Bir kullanıcı MacOS 10.6'dan daha yeni bir işletim sistemine yükselirse, kullanıcının klasörleri yeniden seçmesi için onlara ihtiyacım var, böylece bunları güvenli yer imleriyle favorilere ekleyebilirim.Uygulamamın korumalı olup olmadığını nasıl anlarım?

Uygulamamın korumalı alanları destekleyen bir işletim sisteminde olduğunu nasıl anlarım?

cevap

19

Bildiğim tek yol, APP_SANDBOX_CONTAINER_ID ortam değişkenini aramaktır. Uygulama bir sanal alan kapsayıcısı içinde çalışırken mevcut.

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

için tam aradığım! Çalışırsa bir deneyin ve bu yorumu gözden geçireceğim. Teşekkürler. – NPAssoc

+0

Not: Bu artık MacOS Sierra'da çalışmıyor (şimdiye kadar beta 1, 2 & 3). – Kyle

+0

@Kyle Bu, High Sierra'da iyi çalışıyor gibi görünüyor. – 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

Lütfen kodunuzun ne yaptığını açıklamaya çalışınız. – loki

+0

Denetimler, belirtilen uygulama paketi için geçerli olan “com.apple.security.app-sandbox” hak talebidir. "Evet", uygulamanın korumalı olduğu anlamına gelir. Detaylı API bilgileri burada bulabilirsiniz https://developer.apple.com/reference/security – Oleksii

1

Test Bu 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 
} 
İlgili konular