ภายใน macOS App มีอะไรบ้าง และมันทำหน้าที่อะไร? macOS Apps ดูเหมือนไฟล์ Monolithic (บล็อกเดียว) แตจริงๆ แล้วมันคือโฟลเดอร์ที่มีไอคอนสวยงาม เรียกว่า Bundles เปิด Bundles เหล่านี้ คุณจะพบอาร์เรย์ของไฟล์ที่แอปพลิเคชันต้องการ ทั้งหมดนี้ทำหน้าที่อย่างไร? การเข้าใจ Bundles นี้มีประโยชน์ต่อ Developers, Administrators, Game Modders, Hackintosh Builders, ผู้ที่กังวลเรื่อง Security และทุกคนที่ Troubleshoot แอป
macOS App Bundles คืออะไร?
ตามนิยามของ Apple Bundle คือ "Directory ที่มีโครงสร้าง Hierarchical มาตรฐาน เก็บ Executable Code และ Resources ที่ Code นั้นใช้" อีกชื่อคือ Application มีโครงสร้างและรูปแบบเฉพาะที่ Developer ต้องปฏิบัติเพื่อให้แอปทำงานถูกต้อง หักหลัง Convention เหล่านี้ แอปของคุณน่าจะพัง หากบางอย่างทำงานไม่ถูกต้อง App Bundle อาจเป็นสถานที่ Troubleshoot ที่มีประโยชน์
Apps ไม่ใช่ Bundles เพียงประเภทเดียว Bundles ยังใช้กับไฟล์นามสกุล .framework, .bundle, .plugin, และ .kext Bundles แสดงเป็น Object เดียวใน Finder จนกว่าคุณจะ Step into โดยการ Open Package Contents ของ Bundle
เปิด Application Bundles
ไม่เหมือน Directories ทั่วไป Application Bundles ต้องการขั้นตอนสั้นๆ เพื่อเปิด
- Right-click ไอคอนแอปพลิเคชันใน "/Applications/"
- ใน Context Menu คลิก "Show Package Contents"
- Double-click โฟลเดอร์ "Contents" เพื่อเข้าสู่ Primary Directory ของแอป
โครงสร้างพื้นฐานของ macOS App Bundle
ภายในโฟลเดอร์ "Contents" ของ Bundle คุณจะพบไฟล์หลายไฟล์ ทุก macOS App ต้องมีไฟล์ต่อไปนี้ขั้นต่ำ:
- Info.plist: รวมรายละเอียด Config ที่จำเป็น พร้อม Application Identifier Strings
- MacOS/Executable: โค้ดที่รันเมื่อผู้ใช้เปิดแอป อยู่ในโฟลเดอร์ "MacOS" โดยไม่มี Executable คุณไม่ได้มี Bundle มากนัก
คุณยังมีโอกาสพบไฟล์เพิ่มเติมมากในโฟลเดอร์ทั่วไปเหล่านี้:
- Plugins: Mini-executables แบบ Extension ที่ขยายฟังก์ชันของ Core Executable ต่างจาก Static Resources Plugins เพิ่มฟังก์ชันแบบ Dynamic ให้แอปพลิเคชัน
- Resources: Support Files ที่แอปพลิเคชันพึ่งพา โฟลเดอร์นี้รวมแต่ไม่จำกัดเพียง: รูปภาพ, ไอคอน, เสียง, ฟอนต์, Nib files, Localizations, Data stores ต่างจาก Plugins Resources รองรับ Core Functionality ของ Executable
- Frameworks: เหมือน Plugins Frameworks ระดับสูงที่แอปต้องการ เป็น Bundles ของตัวเอง แต่ใช้ Hierarchical Structure ที่ต่างกัน
- CodeSignature: Structured plist file ให้ Code Signature สำหรับแต่ละส่วนของแอปพลิเคชัน Signature เหล่านี้ให้แอปและ macOS Verify Integrity ของแอปพลิเคชัน และป้องกัน App Hijacking Attacks
iOS App Bundles ใช้โครงสร้างพื้นฐานและรูปแบบไฟล์เดียวกัน แต่อาจปรากฏใน Hierarchy ที่ต่างกัน
Info.plist
Info.plist เป็น Primary Digest ของ Demographics พื้นฐานของแอปพลิเคชัน รวม Bundle Identifier ที่ต้อง Unique จาก Bundle Identifier ทั้งหมด เพื่อทำให้ง่าย Apple แนะนำ Reverse Domain Notation เช่น "com.apple.siri.launcher" หรือ "org.videolan.vlc" เพื่อเรียนรู้ Info.plist เพิ่มเติม ดู Apple's List of Keys และพิจารณาว่าแต่ละ Key ทำอะไร
ไฟล์นี้ยังมีข้อมูลพื้นฐานของแอป: App Icon, App Name, Version Number, Copyright Data, Links สำหรับ Error Reporting, และ Default Language ตาม Convention และ System Rules ตัว "I" ใน "Info" ต้องเป็นตัวใหญ่เสมอ
Executable
นี่คือที่ที่ Primary Code ของแอปพลิเคชันของคุณอยู่ เมื่อแอปพลิเคชันถูกเปิด macOS จะรันโค้ดใน Executable ที่อยู่ใน Directory "MacOS" ของ Bundle เกือบทุกแอปพลิเคชันมี Executable เดียว แตอาจมี 2 ตัวขึ้นไปสำหรับ Helper Executables ไฟล์นี้โดยทั่วไปไม่น่าสนใจใครนอกจาก Developer เนื่องจากไม่สามารถ View หรือ Edit ได้ง่ายโดย User
Resources และ Additional Support Files
สิ่งที่ Essential ต่อแอปพลิเคชันของคุณ ควรอยู่ใน Bundle หากไม่ใช่ส่วนของ Executable เอง ควรไปใน Resource Folders ภายใน Bundle Resources เหล่านี้สามารถเก็บใน Primary "Resources" Folder หรือ Sub-divide เป็นโฟลเดอร์ต่างๆ
- หากไม่แน่ใจ Resource ส่วนใหญ่ไปในโฟลเดอร์ "Resources"
- Frameworks ไปในโฟลเดอร์ "Frameworks"
- Plugins ไปในโฟลเดอร์ "Plugins"
- Localization Files (.lproj Directories) ไปใน Resources Folder
นอกเหนือจากข้อกำหนดเหล่านี้ Apple ให้คำแนะนำและ Convention มากมายที่ควรปฏิบัติ เว้นแต่คุณมีเหตุผลที่ป้องกันได้
สรุป
macOS Applications อยู่ภายใน Bundles ซึ่งเป็น Hierarchical Containers สำหรับไฟล์แอปพลิเคชัน โครงสร้างพื้นฐานเหมือนกันสำหรับทุกแอปพลิเคชัน ไฟล์ที่น่าสนใจ User มากที่สุดอยู่ในโฟลเดอร์ Resources ภายใน Bundle ของแอป