MacOSX에서 앱 번들을 생성하는 방법에는 Easy와 Ugly의 두 가지가 있습니다.
쉬운 방법은 XCode를 사용하는 것입니다. 끝난.
문제는 때때로 당신이 할 수 없다는 것입니다.
제 경우에는 다른 앱을 빌드하는 앱을 만들고 있습니다. 사용자가 XCode를 설치했다고 가정 할 수 없습니다. 또한 MacPorts 를 사용하여 내 앱이 의존하는 라이브러리를 구축하고 있습니다. 배포하기 전에 이러한 dylib가 앱과 함께 번들로 제공되는지 확인해야합니다.
면책 조항 : 나는이 게시물을 작성할 자격이 없습니다. Apple 문서에서 모든 것이 빛나고 기존 앱과 시행 착오를 골라냅니다. 그것은 나를 위해 작동하지만 대부분 잘못되었습니다. 수정 사항이 있으면 이메일을 보내주십시오.
가장 먼저 알아야 할 것은 앱 번들은 단지 디렉토리라는 것입니다.
가상 foo.app의 구조를 살펴 보겠습니다.
foo.app/
내용/
Info.plist
맥 OS/
foo
자원/
foo.icns
Info.plist는 일반 XML 파일입니다. 텍스트 편집기 또는 XCode와 함께 제공되는 Property List Editor 앱으로 편집 할 수 있습니다. (/ Developer / Applications / Utilities / 디렉토리에 있습니다).
포함해야하는 주요 사항은 다음과 같습니다.
CFBundleName- 앱의 이름입니다.
CFBundleIcon -Contents / Resources 디렉토리에있는 것으로 간주되는 아이콘 파일입니다. Icon Composer 앱을 사용하여 아이콘을 만듭니다. (또한 / Developer / Applications / Utilities / 디렉토리에 있습니다.) png를 창에 끌어다 놓기 만하면 자동으로 밉 레벨이 생성됩니다.
CFBundleExecutable -Contents / MacOS / 하위 폴더에있는 것으로 간주되는 실행 파일의 이름입니다.
더 많은 옵션이 있으며 위에 나열된 옵션은 최소한의 것입니다. 다음은 Info.plist
파일 및
App Bundle 구조 에 대한 Apple 문서입니다
.
또한 다음은 샘플 Info.plist입니다.
<? xml version = "1.0"encoding = "UTF-8"?>
<! DOCTYPE plist PUBLIC "-// Apple Computer // DTD PLIST 1.0 // EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version = "1.0">
<dict>
<key> CFBundleGetInfoString </ key>
<string> 발 </ string>
<key> CFBundleExecutable </ key>
<string> foo </ string>
<key> CFBundleIdentifier </ key>
<string> com.your-company-name.www </ string>
<key> CFBundleName </ key>
<string> foo </ string>
<key> CFBundleIconFile </ key>
<string> foo.icns </ string>
<key> CFBundleShortVersionString </ key>
<문자열> 0.01 </ 문자열>
<key> CFBundleInfoDictionaryVersion </ key>
<string> 6.0 </ string>
<key> CFBundlePackageType </ key>
<string> APPL </ string>
<key> IFMajorVersion </ key>
<integer> 0 </ integer>
<key> IFMinorVersion </ key>
<integer> 1 </ integer>
</ dict>
</ plist>
완벽한 세상에서는 실행 파일을 Contents / MacOS / dir에 드롭하고 완료 할 수 있습니다. 그러나 앱에 비표준 dylib 종속성이 있으면 작동하지 않습니다. Windows와 마찬가지로 MacOS는 고유 한 종류의 DLL Hell 과 함께 제공됩니다 .
당신이 사용하는 경우 MacPorts를 당신이에 연결하는 것이 빌드 라이브러리를하여 dylibs의 위치는 하드 코드 실행 파일에있을 것입니다. 정확히 동일한 위치에 dylib가있는 컴퓨터에서 앱을 실행하면 제대로 실행됩니다. 그러나 대부분의 사용자는이를 설치하지 않습니다. 앱을 두 번 클릭하면 충돌이 발생합니다.
실행 파일을 배포하기 전에로드하는 모든 dylib를 수집하고 앱 번들에 복사해야합니다. 또한 올바른 위치에서 dylib를 찾을 수 있도록 실행 파일을 편집해야합니다. 즉, 복사 한 위치.
실행 파일을 손으로 편집하는 것이 위험한 것 같습니까? 다행히도 도움이되는 명령 줄 도구가 있습니다.
otool -L 실행 파일 이름
이 명령은 앱이 의존하는 모든 dylib를 나열합니다. System / Library 또는 usr / lib 폴더에없는 항목이있는 경우 해당 항목을 App Bundle에 복사해야합니다. / Contents / MacOS / 폴더에 복사하십시오. 다음으로 새로운 dylib를 사용하기 위해 실행 파일을 편집해야합니다.
먼저 -headerpad_max_install_names 플래그를 사용하여 링크해야합니다. 이렇게하면 새 dylib 경로가 이전 경로보다 길면 해당 경로가있을 수 있습니다.
둘째, install_name_tool을 사용하여 각 dylib 경로를 변경하십시오.
install_name_tool -change existing_path_to_dylib @ executable_path / blah.dylib executable_name
실용적인 예로, 앱이 libSDL을 사용 하고 otool이 위치를 "/opt/local/lib/libSDL-1.2.0.dylib"로 나열 한다고 가정 해 보겠습니다 .
먼저 앱 번들에 복사합니다.
cp /opt/local/lib/libSDL-1.2.0.dylib foo.app/Contents/MacOS/
그런 다음 새 위치를 사용하도록 실행 파일을 편집하십시오 (참고 : -headerpad_max_install_names 플래그로 빌드했는지 확인하십시오).
install_name_tool -change /opt/local/lib/libSDL-1.2.0.dylib @ executable_path / libSDL-1.2.0.dylib foo.app/Contents/MacOS/foo
휴, 거의 끝났습니다. 이제 현재 작업 디렉토리에 작은 문제가 있습니다.
앱을 시작할 때 현재 디렉토리는 애플리케이션이있는 위의 디렉토리가됩니다. 예 : / Applcations 폴더에 foo.app을 배치하면 앱을 시작할 때 현재 디렉토리가 / Applications 폴더가됩니다. 예상대로 /Applications/foo.app/Contents/MacOS/가 아닙니다.
이를 고려하여 앱을 변경하거나 현재 디렉토리를 변경하고 앱을 실행하는이 마법의 작은 실행기 스크립트를 사용할 수 있습니다.
#! / bin / bash
cd "$ {0 % / *}"
./foo
CFBundleExecutable 이 이전 실행 파일이 아닌 실행 스크립트를 가리 키
도록 Info.plist 파일을 조정해야합니다 .
이제 모두 완료되었습니다. 운 좋게도이 모든 것을 알고 나면 빌드 스크립트에 묻습니다.