מדוע משימות רקע חשובות עבור iOS App אחריות

משתמשים מצפים שאפליקציות iOS ירגישו מיידיות-העברות צריכות להיות חלקות, אינטראקציות צריכות להיות מיידיות, ותכנים צריכים להיות טריים ברגע שהאפליקציית נפתחה.השגת עבודה שאינה צריכה לקרות בקדמת הבמה.

המפתח הוא להשתמש במצב ביצוע רקע הנכון עבור כל פעולה ולציית לכללים המחמירים של iOS על ביצוע רקע. iOS נועד לתעדף את האפליקציה הנוכחית של המשתמש ולהרוג תהליכי רקע כאשר זיכרון או מגבלות כוח דורשים לכן, הבנת מסגרות משימות רקע שהוצגו ב- iOS 13 היא חיונית לבניית אפליקציה מודרנית, בעלת מוניטין טוב.

הבנת ההוצאות להורג ב-iOS

iOS מספק מספר מנגנונים לעבודה רקע, כל אחד מתאים למקרים שונים של שימוש במקרים שונים.ה-FLT:0BackgroundTaskssFLT:1 מסגרת היא הגישה המומלצת למשימות שאינן צריכות לקרות ברגע מדויק.זה עובד על ידי ביצוע משימות לוח הזמנים של המערכת בזמנים אופטימליים, בהתחשב בגורמים כמו קישוריות רשת, רמת סוללות ודפוסי מעורבות משתמשים.

מצבי ביצוע רקע אחרים קיימים עבור תרחישים ספציפיים:

  • (ב) [בחזרה]: [ב], הזדמנות קצרה (בערך 30 שניות) להוריד כמויות קטנות של תוכן מעת לעת.
  • (ב) ,0) עיבוד לאחור של ההרחבה: חלון ארוך יותר ( דקות) למשימות כבדות יותר כמו תחזוקה של מסד נתונים או עיבוד נכסים.
  • [ה]ה' [ה']: [ה'], [ה'], [ה'], [ה'], [ה'], [ה']'[דרוש מקור]]'
  • (ב) ,0URLSSsion רקע מעבירה את ה- 1 בינואר – העלאת מידע או הורדת נתונים גם אם האפליקציה מושעה או מסתיימת.
  • (ב) [15] ויקרא יא"ד/ב"ד/מקומו"ד (ב"ב) , ]] ,[[1924]] ,[[1924]]

עבור עבודה רקעית תכליתית שניתן לקבוע ללא דחיפות מול המשתמשים, ה-FLT:0BGTaskSchedulerph 1 API הוא הבחירה הטובה ביותר.הוא מבסס תזמון, מקטין את הסיכון להיהרג על ידי המערכת, ומשפר את חיי הסוללה בהשוואה לגישות ישנות יותר כמו FLT:1.

המונחים: theרקעTasks Framework

  • (FLT:0)GProcesingTaskFancy 1: (הועדה למשימות שלוקחות כמות בולטת של זמן, כגון ביצוע מסנכרן מלא, ניקוי קבצים מעודנים, או מסד נתונים מקומי.המערכת מעניקה משימות כאלה תקציב זמן גדול יותר ( דקות) ולוח הזמנים אותם כאשר התנאים נוחים (למשל, מכשיר ב-Wi-Fi וטעינה).
  • (FLT:0)GApprefrshTaskFancy:1) - מיועד לרענן קצר, בדרך כלל נמשך כמה שניות. השתמש בו כאשר האפליקציה צריכה לעדכן את נתוני UI או להביא כמויות קטנות של תוכן כך בפעם הבאה שהמשתמש פותח את האפליקציה, הוא מראה מידע טרי.ה המערכת מנסה להפעיל את המשימות האלה לפני שהמשתמש יפעיל את האפליקציה.
  • (ב) [ה]ב"ג'טסקד'ר'ר'ל: המנהל המרכזי שמרשם מזהים, שולח בקשות וידיים שולטות במטפלים שלך כאשר המשימה מתחילה.

שני סוגי המשימה חולקים מחזור חיים דומה: רישום, לוח זמנים, טיפול, ו reschedule.המערכת מחליטה בדיוק מתי לבצע את המשימה; אתה יכול רק לספק רמז דרך FLT:2 עיצוב זה מכבד את משאבי המכשיר של המשתמש ומונע יישומים להפעיל amok ברקע.

משימות רקע - A Step-by- Guide

כדי לשלב משימות רקע לתוך אפליקציית iOS שלך, עליך להשלים מספר שלבים: לאפשר את היכולת, לרשום מזהה משימות, עבודה לוח זמנים, טיפול בביצוע וניהול תפוגה.

1.המצב רקע Capability

(ב) ב[[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]] ו[[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]], [[1924]], [[1924]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]

2.המשימה Identifiers

כל משימה רקע חייבת להיות מחרוזת מזהה ייחודית, בדרך כלל בפורמט הפוך (למשל, FLT 3: 3) אתה רושם את המזהים האלה מוקדם במחזור ההשקה של האפליקציה, כגון ב-FLT:4.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
 BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.myapp.refresh", using: nil) { task in
 self.handleAppRefresh(task: task as! BGAppRefreshTask)
 }
 BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.myapp.cleanup", using: nil) { task in
 self.handleDatabaseCleanup(task: task as! BGProcessingTask)
 }
 return true
}

הסגר לוכד את אובייקט המשימה; בתוך זה אתה קורא מטפל משלך.זכור להטיל את המשימה לסוג קונקרטי המתאים.

3.זמן משימות רקע

הגשת בקשות צריכה לקרות כאשר האפליקציה עוברת לרקע או כאשר יש צורך חוזר.הרמזים על הזמן המוקדם ביותר שהיית רוצה את המשימה לרוץ, אבל המערכת עלולה לעכב אותה עוד יותר.

func scheduleAppRefresh() {
 let request = BGAppRefreshTaskRequest(identifier: "com.example.myapp.refresh")
 request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60) // at least 15 minutes from now
 do {
 try BGTaskScheduler.shared.submit(request)
 } catch {
 print("Could not schedule app refresh: \(error.localizedDescription)")
 }
}

func scheduleDatabaseCleanup() {
 let request = BGProcessingTaskRequest(identifier: "com.example.myapp.cleanup")
 request.earliestBeginDate = Date(timeIntervalSinceNow: 60 * 60) // at least 1 hour
 request.requiresNetworkConnectivity = true // only run when network is available
 request.requiresExternalPower = true // only run when device is charging
 do {
 try BGTaskScheduler.shared.submit(request)
 } catch {
 print("Could not schedule cleanup: \(error.localizedDescription)")
 }
}

התקשר שיטות תזמון אלה במקומות המתאימים: לדוגמה, לאחר משימה רקע מוצלחת (כדי לתקן את הריצה הבאה) או כאשר המשתמש מהשהות את האפליקציה.You עשוי גם לקרוא להם בתגובה לפעולות משתמשים המציינים צורך בעדכונים תקופתיים.

4.העברה בביצוע

כאשר המערכת מחליטה לנהל משימה רקע, היא משתמשת במטפלים שנרשמת בהם.בתוך המטפל שעליו:

  • הגדר מטפל תפוגה אשר מבטל עבודה מתמשכת ומסמן את המשימה כחסר אם הזמן יוצא החוצה.
  • לבצע את העבודה בפועל (למשל, רשת של Bring, מסד נתונים).
  • נקרא (ב) , (או לאחר כישלון).
  • לוח זמנים את האירוע הבא של המשימה (אלא אם כן המשימה נועדה להיות חד פעמי).
func handleAppRefresh(task: BGAppRefreshTask) {
 // Reschedule the next refresh immediately.
 scheduleAppRefresh()

 // Set an expiration handler that will be called if the system needs to reclaim time.
 task.expirationHandler = {
 // Cancel any ongoing operations, clean up resources.
 // Do NOT call setTaskCompleted here; the system will mark it as expired.
 }

 // Perform background work (e.g., fetch new data from server).
 fetchLatestData { success in
 // After the work completes (or errors), inform the scheduler.
 task.setTaskCompleted(success: success)
 }
}

עבור BGProcessingTask, התבנית זהה אבל תקציב הזמן גדול יותר.You יכול גם לבצע פעולות כבדות יותר כמו קומפקטית חנות נתונים Core או חידוש תמונות.

5.בדיקת משימות

משימות רקע הן דבר מסובך ביותר לבדיקת כיוון שהמערכת מחליטה מתי להפעיל אותן. השתמש בטכניקות הבאות כדי לדמות את ביצוען:

  • השתמש ב- Xcode debugger: ההשקה של האפליקציה, ולאחר מכן לעצור ולהשתמש הפקודה (באמצעות lldb או "Simulate רקע רקע Fetch" בתפריט סימולטור).
  • עבור BGProcessingTask, השתמש ב-FLT:11 להתקשר מיד לאחר הרישום, ולאחר מכן לשים את האפליקציה ברקע.
  • השתמש בגישה של ההרחבה (FLT:12) ב- Debug: התקשר ל-FLT:13 ו resubmit to גרימת יומני תזמון.
  • ביצוע משימות על ידי הצבת נקודות מפנה ב המטפל שלך ובדיקת הקונסולה עבור יומני.

Best Practices for Robust רקע משימות

לאחר הנחיות אלה יסייעו לאפליקציית שלך להישאר מגיבה, לשמר סוללה, ולהעביר את סקירת App Store.

עיצוב משימות בלתי אפשריות

משימות רקע ניתן להפריע בכל עת.וודא כי העבודה שלך היא idempotent - הפעלת זה פעמים רבות מייצרת את אותה תוצאה כמו הפעלתו פעם.לדוגמה, להשתמש בלוגיקה upsert במקום להוסיף רק. track מה מעובד באמצעות דגימות או מקטעים כך כי התקדמות חלקית היא בטוחה.

כבוד ל- Expiration Handler

מטפל התפוגה הוא ההזדמנות האחרונה שלך להפסיק את העבודה בחסד.תחת שום נסיבות לא צריך להתעלם ממנה.אם מערכת הכוחות לסיים, כל העבודה הלא גמורה אבדה.במנהל, לבטל כל משימות רשת מתמשכים, לשחרר מנעולים, ולהציל את מצב המחסומים כך שהריצה הבאה תוכל לחזור.

אל תתגברו על

לבקש משימות רקע רק כאשר אתה באמת צריך עדכוני תוכן או תחזוקה.כל הגשת צורכת משאבי מערכת עבור ספיגה. Over-scheduling יכול להוביל למערכת להפחתת האפליקציה שלך או לדחות משימות. חתכת טובה עבור BGAppfreshTask היא כל 15-30 דקות במרבית; BGProcessingTask עשויה לרוץ מדי יום או שבועי.

השתמש ב-Instraints בחוכמה

BGProcesingTaskRequest מציעה 14:14 ו- (FLT:15 להגדיר אלה רק כאשר יש צורך.אם המשימה שלך יכול לרוץ לא מקוון, להמיט את הדרישה לרשת - המערכת תהיה יותר גמישות תזמון ועשויה לרוץ מוקדם יותר.

שמור על אור העבודה ב BGApprefrshTask

משימות אלה יש כמה שניות של זמן קיר לפני התפוגה.פיטש רק מה שנדרש כדי לעדכן את פעילות ה-UI שלך. Heavier כמו הגירה מסד נתונים או הורדות גדולות שייכות BGProcessingTask.

מבחן על מכשירים אמיתיים

סימולטור אינו משכפל לחלוטין את התנהגות לוח הזמנים של משימות רקע.מבחן על מכשיר פיזי עם סוללה משתנה, רשת, ותנאי טעינה. השתמש ב-Gel Energy Log ב- Xcode כדי לראות כיצד האפליקציה שלך משפיעה על חיי הסוללה.

שגיאות יד ו-Re-schedule

אם משימה רקע נכשלת (למשל, טעות ברשת), עדיין כדאי שתחזור על זה לזמן מאוחר יותר, השתמש בהיפוי אקספוננציאלי או מרווח קבוע של דחייה, אל תמשיך לקרוא ל-FLT:16 מבלי להתכווץ, כי המערכת עשויה להפסיק להעניק ביצוע לחלוטין.

מלכודות נפוצות ופתרון בעיות

הנה בעיות תכופות נתקלו בעת ביצוע משימות רקע וכיצד לפתור אותן.

משימה לעולם לא לרוץ

סיבות אפשריות:

  • יכולת חסרה – ודאו כי מצבי רקע ניתן.
  • (ב) ,התאמת ה"לא" (ב"ב) היא אחת מ"המידע" (ב"ב) או ב"FLT:18".
  • משימה לא מומשכת - לאחר משימה משלימה (או נכשל), עליך לקבוע אותה שוב עבור רצף עתידי.
  • עיכובים במערכת - iOS עלול לדחות את ביצוע הרקע אם המכשיר נמצא תחת עומס כבד, נמוך על סוללה, או במצב נמוך כוח.

כדי ליישב את ה[[המאה ה-20]], ניתן ל[[1924]], [[1924]], [[1924]], [[1924]], [[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]

משימות לעתים קרובות

אם המשימה שלך לעתים קרובות מגיע מטפל התפוגה, זה אומר שאתה מנסה לעשות יותר מדי זמן המותר. פרופ 'ניהול עם מכשירים (זמן פרופיל) יכול לחשוף צווארי בקבוק. להעביר פעולות כבדות BGProcessingTask, או לשבור את העבודה לתוך נתחים קטנים יותר לעקוב אחר התקדמות.

אזהרות זיכרון או התרסקות

משימות רקע לרוץ בסביבה מחוספסת.אלכולול והתמודדות עם חפצים גדולים בזהירות. השתמש בריכות אוטומטיות עבור לולאות שיוצרות אובייקטים זמניים רבים.אם האפליקציה קורסת, לבדוק יומני התרסקות עבור סיום נמוך.

טכניקות מתקדמות ושיקולים אמיתיים

עבור יישומים שצריכים איזון תגובה עם עבודה רקע, לשקול שילוב משימות רקע עם תכונות iOS אחרות.

שילוב משימות רקע עם הודעות Push

עבור עדכונים רגישים לזמן, השתמש הודעות מרחוק עם מפתח ההרחבה:22 זה מעיר את האפליקציה ברקע עבור חלון הוצאה להורג קצר (דומה ל BGAppfrshTask) עבור עדכונים מופרעים, לחפש משימות רקע מתוכננות. גישה היברידית זו מבטיחה תוכן טרי תוך שמירה על חיי סוללה.

סינכרון עם CloudKit או Core Data

כאשר מבצעים סינכרן רקע עם CloudKit, השתמש ברקע של LT:23 מביא שיטות לצד BGAppRefrshTask. for Core Data, למנף את ההיסטוריה המתמדת כדי שייבוא רקע לא יתנגש עם קורא פנים.

עקבו אחרי Task Performance

השתמש ב- Xcode (Window > Crashes & Energy > בחר אפליקציה > Open Energy Log Log) כדי לראות כמה פעמים משימות רקע לרוץ, משך הזמן שלהם, ואת ההשפעה שלהם על סוללות. Aim כדי לשמור על זמן ביצוע של כל משימה מתחת לתקציב הטיפוסי של המערכת: 30 שניות עבור BGRefreshTask,sk למשך כמה דקות.

המונחים חיצוניים

למחקר מעמיק יותר, להתייעץ עם המשאבים הסמכותיים הללו:

  • (ב) ,0) מסמך אפל: רקע של קידומו של דבר 1
  • (ב) ◄0 (WDC 2019: התקדמות בנספח הוצאה להורג
  • (ב) ,0) מדריך אפל: הוצאה לאור רקע (Legacy) FigLT:1
  • (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) ,0) הוצאה להורג של רקע לשיפור האנרגיה

מסקנה

(הפעלת משימות רקע עם FLT:0)BGTaskScheduler Reph 1 ו-FLT:2BGProcesingTaskph3 / FLT:4BGAppfresh: תזמון תזמון מהיר או תזמון של יעילות מחשבתית: 5 מאפשר לך לבנות יישומים iOS כי מרגיש מהיר ותגובה תוך ביצוע עבודה רקע הכרחי על ידי גישה שיטתית (הת)