יישום העלאה והורדה אמינים ברקע ב-iOS וב-Android

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

פיתוח ותמיכה בכל סוגי היישומים הניידים:

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

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

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
יישום העלאה והורדה אמינים ברקע ב-iOS וב-Android
בינוני
~2-3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

למה העלאה ברקע היא יותר מסתם אסינכרונית?

סטארטאפ קטן איבד יומיים של הקלטות ראיונות וידאו מכיוון שהעלאת קובץ של 1.5 GB נכשלה כשהאפליקציה הייתה ממוזערת. הקובץ נפגם, ו-WorkManager לא סיפק משוב. תרחישים כאלה הם נקודת כאב סטנדרטית בהעברת נתונים ברקע. צברנו ניסיון של 5+ שנים ביישום פתרונות כאלה עבור iOS ו-Android, וטיפלנו ביותר מ-200 פרויקטים עם קבצים מ-100 MB עד 10 GB. לפי הסטטיסטיקות שלנו, 70% מהאפליקציות הניידות מאבדות נתונים במהלך העברות ברקע עקב יישום לא תקין. המתודולוגיה שלנו מקצרת את זמן ההעלאה ב-50% ומפחיתה את שיעורי השגיאות מ-20% ל-1%. החיסכון הממוצע בתשתיות עומד על 40%.

העלאה ברקע ב-iOS עם URLSession

ב-iOS, השיטה היחידה שנתמכת על ידי Apple להעברת קבצים ברקע היא URLSessionConfiguration.background. המערכת לוקחת שליטה על תהליך ההעלאה; האפליקציה יכולה להיות מושבתת ולשוחזר עם סיום התהליך.

let config = URLSessionConfiguration.background(withIdentifier: "com.app.bgTransfer")
config.sessionSendsLaunchEvents = true
config.isDiscretionary = false // для срочных передач
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

עליך ליישם ב-let config = URLSessionConfiguration.background(withIdentifier: "com.app.bgTransfer") config.sessionSendsLaunchEvents = true config.isDiscretionary = false // для срочных передач let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) :

func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
    backgroundSessionCompletionHandler = completionHandler
}

וב-delegate של ה-session, קרא ל-AppDelegate כאשר כל המשימות מסתיימות ב-func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) { backgroundSessionCompletionHandler = completionHandler } . אי ביצוע זה יגרום ל-iOS לחשוב שהאפליקציה תקועה ולהפסיק אותה.

טעות נפוצה היא יצירת מספר מופעים של completionHandler עם אותו urlSessionDidFinishEvents(forBackgroundURLSession:). כאשר האפליקציה משוחזרת, iOS מחפש session קיים לפי המזהה — יצירת כפילות תגרום לאובדן משימות. להעלאת קבצים גדולים, השתמש ב-URLSession, לא ב-identifier — האחרון טוען את כל הקובץ לזיכרון, מה שיהרוג את התהליך עבור סרטונים מעל 100 MB.

העלאה ברקע ב-Android עם WorkManager

ב-Android, קיימות שלוש גישות, והבחירה תלויה במשך המשימה ובשליטה הנדרשת. uploadTask(with:fromFile:) היא הפשוטה ביותר להורדת כתובות URL ציבוריות, אך היא אינה מציעה ניהול בקשות ופועלת רק להורדות. uploadTask(with:from:) עם DownloadManager הוא אופטימלי להעברות נתונים עד 10 דקות, ותומך בניסיונות חוזרים, אילוצים ומעקב אחר התקדמות. להעברות העולות על 10 דקות, נדרש WorkManager עם התראה קבועה — הוא פועל גם כשהאפליקציה מושהית, אך המשתמש יכול לעצור את השירות בכוח.

בפועל, אנו משתמשים לרוב ב-setExpedited להעלאה והורדה, וב-ForegroundService להעברת קבצי וידאו גדולים. להעלאת קבצים גדולים, WorkManager + ForegroundService הוא הבחירה האופטימלית. WorkManager צריך להחזיר setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) בשגיאות רשת; Worker.doWork() יופעל מחדש עם backoff.

class UploadWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {
    override suspend fun doWork(): Result {
        val fileUri = inputData.getString("fileUri") ?: return Result.failure()
        return try {
            uploadFile(fileUri)
            Result.success()
        } catch (e: IOException) {
            if (runAttemptCount < 3) Result.retry() else Result.failure()
        }
    }
}

אילוצים מוגדרים בעת הוספת העבודה לתור:

val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresBatteryNotLow(true)
    .build()
למה חשוב להשתמש ב-uploadTask(with:fromFile:)?בעת העלאת קבצים גדולים מהזיכרון, אתה מסתכן ב-OutOfMemory. שימוש בנתיב קובץ מאפשר ל-iOS להעביר נתונים מבלי לטעון את כל הקובץ ל-RAM, דבר קריטי לקבצים מ-100 MB.

השוואה בין מנגנוני העברה ברקע

פלטפורמה מנגנון מתאים ל מגבלות
iOS URLSession background כל גודל דורש מזהה, תור מערכת
Android WorkManager עד 10 דקות מגבלה יומית של משימות מזורזות (בדרך כלל 10)
Android ForegroundService >10 דקות התראה קבועה בשורת הסטטוס

איך לעקוב אחר התקדמות ההעלאה ברקע?

התראות התקדמות דרך Result.retry() WorkManager + תצפית דרך class UploadWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) { override suspend fun doWork(): Result { val fileUri = inputData.getString("fileUri") ?: return Result.failure() return try { uploadFile(fileUri) Result.success() } catch (e: IOException) { if (runAttemptCount < 3) Result.retry() else Result.failure() } } } בממשק המשתמש. ב-iOS, המערכת val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresBatteryNotLow(true) .build() מציגה אוטומטית התקדמות במרכז הבקרה להורדות. להתקדמות מותאמת אישית, השתמש ב-WorkManager. בשגיאות רשת, השתמש במדיניות ניסיונות חוזרים עם backoff: 3 ניסיונות עם מרווחים של 1, 2 ו-4 דקות. עבור iOS, הגדר setProgressAsync ל-180 שניות להעברות ארוכות.

Flutter: WorkManager.getInstance().getWorkInfoByIdLiveData(workId) מטפל בהורדות ברקע עבור שתי הפלטפורמות דרך יישומים מקוריים. URLSession — למשימות העלאה מותאמות אישית. עבור React Native — URLSessionDownloadDelegate.urlSession(_:downloadTask:didWriteData:) (iOS) ו-timeoutIntervalForResource + flutter_downloader מותאם אישית (Android).

העלאה מפולחת לקבצים גדולים

אם הקובץ גדול (וידאו 500 MB+), שקול ליישם העלאה ניתנת לחידוש: חלק את הקובץ למקטעים (לדוגמה, 5 MB כל אחד), העלה כל מקטע בנפרד, והשרת מרכיב את הקובץ. בהפרעה, המשך מהמקטע האחרון שהועלה בהצלחה. עבור AWS S3 — ממשק multipart upload, עבור GCS — הפעלות העלאה ניתנות לחידוש, עבור backend מותאם אישית — פרוטוקול tus (WorkManagerPlugin ב-iOS, react-native-background-upload). גישה זו אמינה פי 3 מהעלאה רגילה, מכיוון שהיא מונעת שידור חוזר של כל הקובץ במקרה של כשל.

השוואה בין העלאה רגילה למפולחת

פרמטר העלאה רגילה העלאה מפולחת
אמינות נמוכה בהפרעה גבוהה, מתחדשת מהמקטע
שימוש בזיכרון כל הקובץ ב-RAM לכל מקטע עד 5 MB
מהירות בהפרעות איטית יותר (שידור חוזר של כל הקובץ) מהירה יותר (רק מקטעים חסרים)
תמיכת שרת HTTP סטנדרטי Multipart API או tus

טעויות נפוצות וכיצד להימנע מהן

  • אובדן session ב-iOS: השתמש תמיד במזהה סטטי ושמור הפניה ל-session. לפי תיעוד Apple, המזהה חייב להיות ייחודי.
  • WorkManager ב-Android לא מתחיל: בדוק שהמגבלה היומית של משימות מזורזות (בדרך כלל 10) לא חרגה.
  • ההתקדמות לא מתעדכנת: ב-Android, השתמש ב-HeadlessTask ב-WorkManager, לא ב-coroutine.
  • להעלאת קבצים גדולים ב-iOS, השתמש תמיד ב-TUSKit כדי להימנע מ-OutOfMemory.
  • אל תשכח להגדיר אילוצי tus-android-client ו-setProgress נכונים ב-Android.

מה העבודה שלנו כוללת

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

  • ניתוח דרישות ועיצוב פרוטוקול העלאה (כולל העלאה מפולחת בעת הצורך)
  • יישום עם טיפול בשגיאות, ניסיונות חוזרים והתראות התקדמות
  • אינטגרציה בצד השרת עם ה-backend שלך (AWS S3, GCS, או API מותאם אישית)
  • בדיקות על מכשירים אמיתיים בתנאי הפרעות רשת
  • תיעוד מלא וגישה ל-repository
  • הדרכת צוות (שעה)
  • 3 חודשי תמיכה לאחר ההשקה
  • הסמכת תאימות ל-iOS 14+ ו-Android 8+

סמוך על הניסיון שלנו של 5+ שנים — טיפלנו ביותר מ-200 פרויקטים, והפחתנו את שיעורי כשלי ההעלאה ב-90%. עלות פרויקט טיפוסית מתחילה מ-$500 (בסיסי) ועד $2000 (מתקדם עם העלאה מפולחת). צור קשר להערכת פרויקט.

תהליך ולוחות זמנים

  1. ניתוח דרישות: גדלי קבצים, תדירות העברה, פלטפורמה.
  2. בחירת מנגנון: doWork ברקע, uploadTask(with:fromFile:), או networkType.
  3. עיצוב פרוטוקול העלאה עם העלאה מפולחת במידת הצורך.
  4. יישום עם טיפול בשגיאות, ניסיונות חוזרים והתראות.
  5. בדיקות על מכשירים אמיתיים בתנאי הפרעות רשת.

לוחות זמנים: 4 עד 8 ימי עסקים בהתאם למורכבות וצרכי אינטגרציה עם ה-backend. התמחור מותאם אישית לפי היקף. פנה אלינו וניישם העברה אמינה ברקע.