본문 바로가기
iOS

[macOS] SandBox 환경에서 개발 불가능한 상황 발생

by Bokoo14 2024. 1. 13.

샌드박스란?

https://bokoo.tistory.com/entry/macOS-%EC%83%8C%EB%93%9C%EB%B0%95%EC%8A%A4%EB%9E%80

 

[macOS] 샌드박스란?

App Sandbox란? 앱이 손상된 경우 손상을 방지하기 위해 macOS 앱의 시스템 리소스 및 사용자 데이터에 대한 액세스를 제한합니다. 앱 샌드박스는 권한을 통해 요청된 리소스에 대한 앱의 액세스를

bokoo.tistory.com


-600에러와 샌드박스

상황

샌드박스 환경의 Xcode에서 AppleScript를 실행하여 다른 앱(예: Numbers)을 동작시키면 -600에러가 발생한다.

에러 내용

AppleScript 실행 오류: {
    NSAppleScriptErrorAppName = Numbers;
    NSAppleScriptErrorBriefMessage = "Application isn\\U2019t running.";
    NSAppleScriptErrorMessage = "Numbers got an error: Application isn\\U2019t running.";
    NSAppleScriptErrorNumber = "-600";
    NSAppleScriptErrorRange = "NSRange: {221, 8}";
}

오류 분석

이 에러는 macOS의 App Sandbox 기능 때문이다.
샌드박스는 앱이 시스템 리소스 및 사용자 데이터에 접근하는 것을 제한한다.
즉, 앱이 다른 앱을 직접 실행시키거나, AppleScript를 통해 다른 앱에 접근하는 것을 기본적으로 허용하지 않는다.

샌드박스 환경에서는 앱이 다른 앱의 프로세스를 시작하거나, 시스템 전체의 자원에 접근하는 시도는 모두 제한된다.

따라서, 샌드박스 환경에서 AppleScript를 통해 Numbers와 같은 다른 앱을 여는 행위는 샌드박스의 정책을 위반하게 되며, 이로 인해 -600에러가 발생한다.

사유

“샌드박스” + “다른 앱을 열려는 시도” 때문

mac app을 release하기 위해서는 App Sandbox 기능을 활성화해야 합니다. (샌드박스는 맥 앱 배포를 위해 꼭 필요한 것.)

sandbox는 앱의 액세스를 제한하여 시스템 리소스와 사용자 데이터를 보호하는 기능을 합니다.

따라서, 샌드박스의 기능과 우리가 하려는 애플 스크립트를 통해 다른 앱(넘버스)을 여는 것이 충돌 됩니다.

그래서 -600에러가 발생합니다.

 

이를 해결하기 위해서는 -600에러를 해결하면서 샌드박스를 삭제하지 않는 방법을 찾거나, 샌드박스를 삭제하여야 함.

샌드박스를 삭제하게 되면 앱 배포는 불가능 -> 무조건 웹으로 배포해야 함(.dmg형식)

 

해결 방안

1. 임시 예외 자격(entitlement) 추가

  • Info.plist 또는 entitlements 파일에서 임시 예외(temporary exception entitlements)를 추가해
    특정 AppleEvent 권한을 부여할 수 있다.
  • 그러나, 최신 macOS 및 앱스토어 심사에서는 임시 예외 권한도 대부분 허용되지 않으므로 실질적으로 해결이 되지 않는 경우가 많다.

2. 샌드박스 비활성화

  • 샌드박스 설정을 꺼서 제한을 없앨 수 있다.
  • 하지만 이 경우, Mac App Store 배포가 불가능하며, 웹 배포(.dmg 등)와 같은 스토어 외부 배포만 가능하다.
  • 애플의 앱 배포 정책과 보안 가이드에 맞지 않기 때문에, 최후의 수단으로만 고려해야 한다.

 

references


해결 방안

A. app sandbox temporary exception entitlements

앱 샌드박스 임시 예외 자격을 설정하는 방법이다. 

임시 예외 자격은 macOS 앱이 App Sandbox에서 허용하지 않는 특정 작업을 수행하도록 허용한다. 

numbersForMac.entitlements라는 파일에서 temporary exception entitlements를 설정해준다. 

진행 상황

다른 개발자들이 이미 시도했던 방법이지만 오류 해결 안됨

 

B. 샌드박스 삭제

샌드박스를 삭제함으로써 앱의 액세스를 제한환경에서 벗어나도록 해준다.

하지만, 이 방법은 앱스토어 배포를 포기해야 하는 방법

 

결론

macOS의 App Sandbox는 앱의 보안성과 사용자 데이터를 보호하는 핵심 기능이다.
샌드박스 환경에서는 앱이 다른 앱을 직접 실행하거나, AppleScript를 통해 시스템 전체에 접근하는 행위가 제한된다.
따라서 -600에러는 샌드박스 정책에 위배되는 시도가 원인이다.

만약 샌드박스를 유지하면서도 다른 앱과의 연동이 반드시 필요하다면, 공식 문서에 안내된 권한(exceptions) 설정을 시도해보고,
그래도 불가능하다면 웹 배포 등 샌드박스를 해제한 상태에서만 기능을 제공해야 한다.


결정

팀원들과 충분한 논의 끝에, 샌드박스(App Sandbox)를 비활성화하고 앱스토어 배포가 아닌 웹 배포(.dmg 형식)로 개발을 진행하기로 결정하였다.

  • 샌드박스 환경에서는 다른 앱과의 연동(예: AppleScript로 Numbers 등 외부 앱 실행)이 원천적으로 제한되기 때문이다.
    • 샌드박스는 macOS의 보안 정책상 앱이 시스템의 다른 리소스나 외부 앱에 접근하는 것을 막는다.
      • 앱이 샌드박스 환경에서 AppleScript를 통해 다른 앱을 열려고 하면, -600에러가 발생하며 정상적인 동작이 불가능하다.
  • 임시 예외 자격(entitlement)을 부여해도 최신 macOS 및 Mac App Store 심사에서는 거의 허용되지 않기 때문이다.
    • 공식적으로 권장되는 해결책(temporary exception entitlements)도 실제 배포 환경에서는 잘 적용되지 않거나, 스토어에서 거절되는 경우가 많다.
  • 업무 특성상 반드시 다른 앱을 제어하거나, 외부 연동 기능이 필요했기 때문이다.
    • 앱의 핵심 기능 자체가 AppleScript 등으로 다른 앱을 자동화하거나 실행하는 것이 필수적이었으므로,
      샌드박스 정책을 유지한 채로는 기능 구현이 불가능했다.
  • Mac App Store 배포를 포기하는 대신, 웹 배포로 자유로운 기능 구현을 선택한 것이다.
    • 샌드박스를 비활성화하면 앱스토어 등록은 불가능하지만, .dmg 등 웹 배포 방식을 통해
      보안 정책에 제약받지 않고 원하는 기능을 구현할 수 있다.

결론

결국 샌드박스 환경에서는 필요한 기능을 구현할 수 없었기 때문에, 보안성과 공식 배포 경로를 일부 포기하더라도 팀 전체가 웹 배포로 방향을 전환하기로 결정한 것이다.
이 과정에서 애플의 공식 문서와 커뮤니티 자료, 샌드박스 정책의 현실적 제약을 충분히 고려하여 가장 현실적인 선택을 한 것이라 할 수 있다.

 

[references]