ลิงก์ทรัพยากร Dependency ของ Firebase แบบคงที่หรือแบบไดนามิก

เริ่มตั้งแต่ CocoaPods 1.9.0 และ Firebase 7 คุณเลือกได้ว่าจะสร้างทรัพยากร Dependency ของ Firebase เป็นเฟรมเวิร์กแบบคงที่หรือแบบไดนามิก เราขอแนะนำให้ใช้เฟรมเวิร์กแบบคงที่ เว้นแต่ว่าคุณต้องการใช้งานไลบรารีแบบไดนามิกบางอย่าง

โปรดทราบว่าไลบรารีที่พัฒนานอก GitHub จะลิงก์ได้ในแบบคงที่เท่านั้น แม้แต่กับ CocoaPods 1.9.0 ขึ้นไป ปัจจุบันรายการไลบรารีนี้ประกอบด้วย AdMob, Analytics, Firebase ML และการตรวจสอบประสิทธิภาพ ช่องทางการเผยแพร่อื่นๆ ทั้งหมด รวมถึงไฟล์ ZIP, Swift Package Manager และ Carthage จะมีไลบรารีที่เชื่อมโยงแบบคงที่เท่านั้น

เอกสารนี้จะสมมติว่ามีความรู้ความเข้าใจเกี่ยวกับการลิงก์แบบไดนามิกและแบบคงที่บนแพลตฟอร์มของ Apple หากคุณไม่คุ้นเคยกับแนวคิดเหล่านี้ ให้ดูเอกสารต่อไปนี้

เนื่องจากเอกสารนี้เกี่ยวข้องกับประเภทของการลิงก์ไลบรารี ไม่ใช่การโหลดแพ็กเกจทรัพยากรที่สั่งการไม่ได้ จึงมีการใช้คำว่า library และ framework แทน

การลิงก์แบบคงที่

ไลบรารีที่ลิงก์แบบคงที่จะรวมกันอยู่ในไฟล์ปฏิบัติการของแอปพลิเคชันในเวลาที่สร้าง ดังนั้น ไฟล์ออบเจ็กต์ในไลบรารีแบบคงที่จะแสดงในแอปเมื่อเปิดตัว และไม่จำเป็นต้องมีการแก้ไขไฟล์ขณะเปิดแอปโดย Linker แบบไดนามิก ดังนั้นแอปที่ใช้การลิงก์แบบคงที่จะทํางานได้เร็วขึ้น ซึ่งมาพร้อมกับไฟล์ปฏิบัติการไบนารี / แอปที่มีขนาดใหญ่กว่าเล็กน้อย แต่ควรสังเกตว่าขนาดไฟล์ปฏิบัติการที่มีขนาดใหญ่กว่าจะได้รับการชดเชยเนื่องจากไม่มีไลบรารีแบบไดนามิกในแพ็กเกจ

คุณบังคับให้ลิงก์แบบคงที่ของทรัพยากร Dependency ของ Firebase ได้ด้วยการระบุการลิงก์ใน Podfile อย่างชัดแจ้ง ดังนี้

# cocoapods >= 1.9.0
use_frameworks! :linkage => :static

การลิงก์แบบไดนามิก

ไลบรารีที่ลิงก์แบบไดนามิกจะจัดเก็บอยู่ใน App Bundle แยกต่างหากจากไฟล์ปฏิบัติการหลักของแอป และไลบรารีแบบไดนามิกต้องโหลดไลบรารีดังกล่าว ณ เวลาที่เปิดแอป เฟรมเวิร์กของ Apple จะลิงก์กันแบบไดนามิกทั้งหมดเพื่อเปิดใช้การแชร์โค้ดระหว่างกระบวนการ ในทำนองเดียวกัน คุณสามารถใช้เฟรมเวิร์กแบบไดนามิกเพื่อแชร์โค้ดระหว่างเป้าหมายของแอปและส่วนขยายได้ คุณจะแชร์เฟรมเวิร์กแบบไดนามิกระหว่างแอปพลิเคชันแยกกันไม่ได้ แม้ว่าทั้งสองแอปพลิเคชันจะลงนามโดยนักพัฒนาซอฟต์แวร์คนเดียวกันก็ตาม

หากต้องการใช้ Firebase เป็นทรัพยากร Dependency ของเป้าหมายเฟรมเวิร์กแบบไดนามิก คุณจะต้องลิงก์ Firebase แบบไดนามิกด้วย มิเช่นนั้น คุณจะพบคำจำกัดความของคลาสที่ซ้ำกันในรันไทม์ของแอป การลิงก์แบบไดนามิกเป็นลักษณะการทำงานเริ่มต้นของ use_frameworks! แต่คุณยังคงระบุการลิงก์แบบไดนามิกใน Podfile ได้อย่างชัดเจน

# cocoapods >= 1.9.0
use_frameworks! :linkage => :dynamic

โปรดทราบว่าการลิงก์แบบไดนามิกอาจเพิ่มเวลาเปิดตัวของแอป โดยเฉพาะอย่างยิ่งหากแอปมีทรัพยากร Dependency จำนวนมาก