החל מ-CocoaPods 1.9.0 ומ-Firebase 7, אתם יכולים לבחור אם יחסי התלות של Firebase ייבנו כמסגרות סטטיות או דינמיות. מומלץ להשתמש במסגרות סטטיות, אלא אם נדרשים התנהגויות מסוימות של ספריות דינמיות.
שימו לב: אפשר לקשר ספריות שפותחו מחוץ ל-GitHub רק באופן סטטי, גם אם משתמשים ב-CocoaPods בגרסה 1.9.0 ואילך. כרגע, רשימת הספריות הזו כוללת את AdMob, Analytics, Firebase ML ו-Performance Monitoring. כל שאר ערוצי ההפצה, כולל קובץ ה-ZIP, Swift Package Manager ו-Carthage, מספקים רק ספריות עם קישור סטטי.
ההנחה במאמר הזה היא שיש לכם ידע מעשי בקישור דינמי וסטטי בפלטפורמות של אפל. אם אתם לא מכירים את המושגים האלה, כדאי לעיין במסמכים הבאים:
במסמך הזה אנחנו מתמקדים בסוגי הקישור לספרייה ולא בטעינה של חבילות משאבים שאינן ניתנות להפעלה, ולכן אנחנו משתמשים במונחים ספרייה ומסגרת לסירוגין.
קישור סטטי
ספריות שמקושרות באופן סטטי נארזות בקובץ ההפעלה של האפליקציה בזמן הבנייה. כתוצאה מכך, קובצי האובייקט בספרייה הסטטית יהיו קיימים באפליקציה כשהיא תופעל, ולא יהיה צורך לפתור אותם בזמן הפעלת האפליקציה על ידי המקשר הדינמי. כתוצאה מכך, אפליקציות שמשתמשות בקישור סטטי יופעלו מהר יותר. החיסרון הוא שקובץ הבינארי או קובץ ההפעלה של האפליקציה יהיו גדולים יותר, אבל צריך לזכור שהגודל הגדול יותר של קובץ ההפעלה יקוזז בגלל היעדר ספריות דינמיות בחבילה.
אפשר לכפות קישור סטטי של תלות ב-Firebase על ידי ציון הקישור באופן מפורש בקובץ Podfile:
# cocoapods >= 1.9.0
use_frameworks! :linkage => :static
קישור דינמי
ספריות שמקושרות באופן דינמי מאוחסנות בחבילת האפליקציה בנפרד מהקובץ הראשי של האפליקציה, והן צריכות להיטען בזמן הפעלת האפליקציה על ידי המקשר הדינמי. כל המסגרות של אפל מקושרות באופן דינמי כדי לאפשר שיתוף קוד בין תהליכים. באופן דומה, אפשר להשתמש במסגרות דינמיות כדי לשתף קוד בין יעדי האפליקציה והתוסף. אי אפשר לשתף מסגרות דינמיות בין אפליקציות נפרדות, גם אם שתיהן חתומות על ידי אותו מפתח.
אם רוצים להשתמש ב-Firebase כתלות של יעד של מסגרת דינמית, צריך גם לקשר את Firebase באופן דינמי. אחרת, תיתקלו בהגדרות כיתות כפולות בזמן הריצה של האפליקציה. קישור דינמי הוא התנהגות ברירת המחדל ב-use_frameworks!
, אבל עדיין אפשר לציין במפורש קישור דינמי ב-Podfile:
# cocoapods >= 1.9.0
use_frameworks! :linkage => :dynamic
שימו לב: קישור דינמי עלול להאריך את זמן ההפעלה של האפליקציה, במיוחד אם יש לאפליקציה הרבה תלותיות.