2012-08-29 111 views
10

我有一个应用程序,目标是在沙箱和非沙箱MacOS中运行。如果用户从MacOS 10.6升级到更高版本的操作系统,我需要用户重新选择文件夹,以便我可以使用安全书签将它们加入书签。如何检测我的应用程序是否是沙盒?

如何检测到我的应用程序位于支持沙盒的操作系统上?

回答

19

我知道的唯一方法就是寻找APP_SANDBOX_CONTAINER_ID环境变量。它在应用程序在沙箱容器内运行时出现。

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

正是我要找的!如果它有效,我会试一试并修改此评论。谢谢。 – NPAssoc

+0

注意:这不再适用于macOS Sierra(到目前为止测试版1,2和3)。 – Kyle

+0

@凯尔这似乎在高塞拉利昂罚款。 – 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

请尝试解释你的代码的作用。 – loki

+0

它检查是否存在指定应用程序包的有效授权“com.apple.security.app-sandbox”。 “是”表示应用程序是沙盒。 详细的API信息可以在这里找到https://developer.apple.com/reference/security – Oleksii

1

测试本作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 
} 
相关问题