2012-08-29 29 views
10

मेरे पास एक ऐसा एप्लिकेशन है जिसे सैंडबॉक्स और गैर-सैंडबॉक्स वाले मैकोज़ दोनों में चलाने के लिए लक्षित किया गया है। यदि कोई उपयोगकर्ता मैकोज़ 10.6 से बाद के ओएस तक अपग्रेड करता है तो मुझे उपयोगकर्ता को फ़ोल्डरों को फिर से लेने की आवश्यकता होती है ताकि मैं उन्हें सुरक्षित बुकमार्क के साथ बुकमार्क कर सकूं।मैं कैसे पता लगा सकता हूं कि मेरा ऐप सैंडबॉक्स है या नहीं?

मुझे कैसे पता चलेगा कि मेरा एप्लिकेशन ओएस पर है जो सैंडबॉक्सिंग का समर्थन करता है?

उत्तर

19

मुझे पता है कि एकमात्र तरीका APP_SANDBOX_CONTAINER_ID पर्यावरण चर के लिए देखना है। यह तब मौजूद है जब ऐप एक सैंडबॉक्स कंटेनर के अंदर चल रहा है।

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

के लिए वास्तव में मैं के लिए देख रहा हूँ! यदि यह काम करता है तो मैं इसे इस टिप्पणी को आज़माकर संशोधित करूंगा। धन्यवाद। – NPAssoc

+0

नोट: यह अब मैकोज सिएरा (बीटा 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 
} 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^