Background Fetch একটি iOS প্রক্রিয়া যা নতুন কন্টেন্ট ডাউনলোড করার জন্য পর্যায়ক্রমে ব্যাকগ্রাউন্ডে অ্যাপকে জাগ্রত করে। সিস্টেম ব্যবহারকারীর আচরণ বিশ্লেষণ করে এবং আপডেটের জন্য সর্বোত্তম উইন্ডো নির্বাচন করে। Apple, 2026 অনুসারে, অ্যাপ অপারেশন সম্পাদনের জন্য 30 থেকে 120 সেকেন্ড পায়, এরপর সিস্টেম প্রক্রিয়াটি স্থগিত বা বন্ধ করে দেয়।
মূল বিষয়
Background Fetch একটি iOS API যা অ্যাপকে ব্যাকগ্রাউন্ডে পর্যায়ক্রমে নতুন ডেটা গ্রহণ করতে দেয়। প্রথমবার iOS 7-এ Background App Refresh প্রক্রিয়ার সাথে প্রবর্তিত হয়। মূল লক্ষ্য হলো ব্যবহারকারী অ্যাপ খোলার সময় কন্টেন্ট আপডেট থাকা, লোড হওয়ার অপেক্ষা না করে।
পুশ নোটিফিকেশন সার্ভার দ্বারা শুরু হয় — সার্ভার ডিভাইসে সিগন্যাল পাঠায়, এবং সিস্টেম সিদ্ধান্ত নেয় অ্যাপ জাগাবে কিনা। Background Fetch iOS নিজেই ডিভাইস ব্যবহারের প্যাটার্নের ভিত্তিতে শুরু করে। পুশ জরুরি বার্তার জন্য উপযুক্ত, Fetch নির্ধারিত কন্টেন্ট আপডেটের জন্য (সংবাদ, সোশ্যাল মিডিয়া ফিড)।
Background Fetch iOS-এ ব্যাকগ্রাউন্ড নির্বাহের কয়েকটি প্রক্রিয়ার মধ্যে একটি। BGAppRefreshTask (iOS 13+) একই কাজ করে কিন্তু আরও নমনীয় শিডিউলিং সহ। Background Modes (অডিও, অবস্থান) ধারাবাহিক অপারেশনের জন্য। Silent Push সার্ভার-শুরু আপডেট। Fetch iOS 12 এবং নিচের সমর্থনকারী প্রকল্পের জন্য প্রাসঙ্গিক থাকে।
iOS অ্যাপ জাগানোর সর্বোত্তম সময় নির্ধারণে মেশিন লার্নিং অ্যালগরিদম ব্যবহার করে। সিস্টেম বিশ্লেষণ করে ব্যবহারকারী সাধারণত কখন অ্যাপ খোলে, কতক্ষণ ব্যবহার করে এবং কতবার ফিরে আসে। এই ডেটার ভিত্তিতে, iOS Background Fetch-এর জন্য উইন্ডো গণনা করে।
যখন সিস্টেম অ্যাপ জাগানোর সিদ্ধান্ত নেয়, এটি AppDelegate-এ application(_:performFetchWithCompletionHandler:) মেথড কল করে। অ্যাপের ন্যূনতম পরিমাণ নতুন ডেটা লোড করা এবং তিনটি স্ট্যাটাসের একটি সহ কমপ্লিশন হ্যান্ডলার কল করা উচিত: .newData (ডেটা লোড হয়েছে), .noData (কোনো নতুন ডেটা নেই) বা .failed (ত্রুটি)। স্ট্যাটাস ভবিষ্যতে জাগ্রত হওয়ার ফ্রিকোয়েন্সি প্রভাবিত করে।
.newData স্ট্যাটাস সিস্টেমকে জানায় যে আপডেট উপকারী ছিল — iOS জাগ্রত হওয়ার ফ্রিকোয়েন্সি বাড়াতে পারে। .noData ইঙ্গিত দেয় কোনো ডেটা নেই — ফ্রিকোয়েন্সি একই থাকে বা কমে। .failed সমস্যা নির্দেশ করে — সিস্টেম ব্যাটারি বাঁচাতে ফ্রিকোয়েন্সি কমায়। জোর দেওয়া উচিত সৎ স্ট্যাটাসের উপর, .newData জোর করার উপর নয়।
| স্ট্যাটাস | অর্থ | প্রভাব |
|---|---|---|
| .newData | ডেটা সফলভাবে লোড হয়েছে | ফ্রিকোয়েন্সি বাড়তে পারে |
| .noData | পরীক্ষায় নতুন ডেটা পাওয়া যায়নি | ফ্রিকোয়েন্সি একই থাকে |
| .failed | নেটওয়ার্ক বা সার্ভার ত্রুটি | ফ্রিকোয়েন্সি কমে |
Background Fetch সক্রিয় করতে দুটি ধাপ প্রয়োজন: Xcode-এ ক্যাপাবিলিটি সক্রিয় করুন এবং কোডে ন্যূনতম ব্যবধান নির্ধারণ করুন। ক্যাপাবিলিটি Target — Signing & Capabilities — Background Modes — Background Fetch বক্স চেক করার মধ্যে অবস্থিত। এই ধাপ ছাড়া, সিস্টেম অ্যাপ জাগাবে না।
UIApplication.shared.setMinimumBackgroundFetchInterval মেথড Fetch কলের মধ্যে সেকেন্ডে ন্যূনতম সময় নির্ধারণ করে। মান UIApplication.backgroundFetchIntervalMinimum (প্রায় 15 মিনিট) সিস্টেমকে জানায় যতবার শক্তি-সাশ্রয়ী ততবার অ্যাপ জাগাতে। application(_:didFinishLaunchingWithOptions:) এ ব্যবধান নির্ধারণ করা মানক প্রক্রিয়া।
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
Xcode-এ Background Fetch সক্রিয় করলে, এটি স্বয়ংক্রিয়ভাবে Info.plist আপডেট করে — UIBackgroundModes কী fetch মানসহ যোগ করে। এটি একটি বাধ্যতামূলক ধাপ: এটি ছাড়া অ্যাপ performFetchWithCompletionHandler কল পাবে না। আপনি P list Source বা Build Settings-এর মাধ্যমে যাচাই করতে পারেন।
আসুন একটি সংবাদ অ্যাপের জন্য সম্পূর্ণ Background Fetch বাস্তবায়ন দেখি। বাস্তবায়নে ডেটা লোডিং, ক্যাশিং এবং কমপ্লিশন হ্যান্ডলার কল অন্তর্ভুক্ত। কোড AppDelegate-এ নির্বাহিত হয় — একমাত্র স্থান যেখানে সিস্টেম fetch কল করে।
func application(
_ application: UIApplication,
performFetchWithCompletionHandler handler: @escaping (UIBackgroundFetchResult) -> Void
) {
let url = URL(string: "https://api.example.com/latest")!
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
handler(.failed)
return
}
do {
let articles = try JSONDecoder().decode([Article].self, from: data)
cacheArticles(articles)
handler(articles.isEmpty ? .noData : .newData)
} catch {
handler(.failed)
}
}.resume()
}
Background Fetch-এর মাধ্যমে ডেটা লোড করার পর, এটি লোকাল স্টোরেজ — CoreData, UserDefaults বা File Manager-এ সংরক্ষণ করা প্রয়োজন। অ্যাপ খোলার সময় ডেটা ইতিমধ্যে উপলব্ধ থাকা উচিত। থ্রেড-নিরাপদ লেখার জন্য ব্যাকগ্রাউন্ড কনটেক্সটসহ CoreData ব্যবহার করুন। সংরক্ষণের পর, মূল থ্রেডে UI আপডেট করুন।
func cacheArticles(_ articles: [Article]) {
let container = NSPersistentContainer(name: "AppModel")
container.performBackgroundTask { context in
articles.forEach { article in
let entity = ArticleEntity(context: context)
entity.id = Int64(article.id)
entity.title = article.title
entity.body = article.body
}
try? context.save()
}
}
পরীক্ষার জন্য, সিমুলেটর ব্যবহার করুন — Xcode-এ Debug — Simulate Background Fetch নির্বাচন করুন। প্রকৃত ডিভাইসে, সিস্টেম fetch করার সিদ্ধান্ত নেওয়া পর্যন্ত অপেক্ষা করতে হবে। গতি বাড়াতে, আপনি ন্যূনতম ব্যবধান 1 মিনিট সেট করতে পারেন, কিন্তু ব্যাটারি কম থাকলে সিস্টেম এটি উপেক্ষা করতে পারে।
Background Fetch-এর বেশ কয়েকটি সীমাবদ্ধতা রয়েছে যা অ্যাপ আর্কিটেকচার ডিজাইন করার সময় বিবেচনা করা গুরুত্বপূর্ণ। প্রধানটি হলো সিস্টেম সম্পূর্ণরূপে কল ফ্রিকোয়েন্সি নিয়ন্ত্রণ করে এবং ডেভেলপার এটি গ্যারান্টি দিতে পারে না। ন্যূনতম ব্যবধান নির্ধারণ করলেও, সিস্টেম ঘন্টার পর ঘন্টা fetch কল নাও করতে পারে।
সিস্টেম কাজ নির্বাহের জন্য অ্যাপকে সীমিত সময় বরাদ্দ করে — সাধারণত 30 সেকেন্ড পর্যন্ত। যদি অ্যাপ সেই সময়ের মধ্যে কমপ্লিশন হ্যান্ডলার কল না করে, সিস্টেম জোর করে প্রক্রিয়া বন্ধ করে এবং ভবিষ্যতে জাগ্রত হওয়ার ফ্রিকোয়েন্সি কমায়। সকল নেটওয়ার্ক অনুরোধ সংক্ষিপ্ত হওয়া উচিত — প্রতি কল 1-2টির বেশি নয়।
iOS Background Fetch শিডিউল করার সময় ব্যাটারি লেভেল বিবেচনা করে। চার্জ 20% এর নিচে থাকলে, জাগ্রত হওয়ার ফ্রিকোয়েন্সি কমে যায়। লো পাওয়ার মোড সক্রিয় থাকলে, সিস্টেম সব অ্যাপের জন্য ব্যাকগ্রাউন্ড আপডেট সম্পূর্ণরূপে নিষ্ক্রিয় করতে পারে। ব্যবহারকারী সেটিংসে নির্দিষ্ট অ্যাপের জন্য Background App Refreshও নিষ্ক্রিয় করতে পারেন।
Background Fetch থেকে শুরু হওয়া URLSession স্ট্যান্ডার্ড মোডে কাজ করে — ব্যাকগ্রাউন্ড সেশন সমর্থন ছাড়া। বড় ডাউনলোডের জন্য, ব্যাকগ্রাউন্ড কনফিগারেশনসহ URLSession ব্যবহার করুন। সিস্টেম fetch শেষ হওয়ার পরও ডাউনলোড চালিয়ে যাবে, কিন্তু পরবর্তী জাগ্রত হওয়া পর্যন্ত অগ্রগতি ট্র্যাক করা হবে না।
iOS 13 থেকে শুরু করে, Apple BGTaskScheduler-কে Background Fetch-এর প্রতিস্থাপন হিসেবে সুপারিশ করে। BGTaskScheduler আরও নমনীয় শিডিউলিং, দুই ধরনের কাজ (refresh এবং processing) এবং আইডেন্টিফায়ারসহ কাজ নিবন্ধন প্রদান করে। মাইগ্রেশনে কয়েকটি ধাপ অন্তর্ভুক্ত এবং সব নতুন প্রকল্পের জন্য সুপারিশ করা হয়।
প্রথম ধাপ — BGTaskSchedulerPermittedIdentifiers কী-এর মাধ্যমে Info.plist-এ কাজের আইডেন্টিফায়ার সংজ্ঞায়িত করা। দ্বিতীয় — BGTaskScheduler.shared.register-এর মাধ্যমে AppDelegate-এ কাজ নিবন্ধন করা। তৃতীয় — performFetchWithCompletionHandler কলকে register-এ পাঠানো হ্যান্ডলার দিয়ে প্রতিস্থাপন করা। চতুর্থ — কাজ শিডিউল করতে submit কল করা।
// আগে (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
// মাইগ্রেশনের পর (BGTaskScheduler)
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.example.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
let request = BGAppRefreshTaskRequest(
identifier: "com.example.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
BGTaskScheduler আরও নিয়ন্ত্রণ প্রদান করে: দীর্ঘ অপারেশনের জন্য BGProcessingTask (10 মিনিট পর্যন্ত), requiresNetworkConnectivity এবং requiresExternalPower-এর মাধ্যমে নির্বাহের শর্ত, এবং সুন্দর সমাপ্তির জন্য expiration হ্যান্ডলার। সিস্টেম অ্যাপ ব্যবহারও বিশ্লেষণ করে, কিন্তু ডেভেলপার আরও নির্ভুল প্রয়োজনীয়তা নির্ধারণ করতে পারে।
যদি অ্যাপ iOS 12 এবং নিচে সমর্থন করে, Background Fetch পর্যায়ক্রমিক আপডেটের জন্য একমাত্র বিকল্প থাকে। BGTaskScheduler শুধুমাত্র iOS 13+ থেকে উপলব্ধ। এই ক্ষেত্রে, একটি র্যাপার ব্যবহার করুন: if #available(iOS 13, *)-এর মাধ্যমে উপলব্ধতা পরীক্ষা করুন এবং উপযুক্ত API কল করুন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
নির্দিষ্ট ফ্রিকোয়েন্সি নথিভুক্ত নয় এবং ব্যবহারকারীর আচরণের উপর নির্ভর করে। সিস্টেম বিশ্লেষণ করে ব্যবহারকারী কতবার অ্যাপ খোলে এবং সেই অনুযায়ী ফ্রিকোয়েন্সি সামঞ্জস্য করে। গড়ে, সক্রিয় ব্যবহারে, fetch প্রতি ঘন্টায় 1–3 বার কল হতে পারে। কম ব্যবহারে — দিনে 1–2 বার।
তিনটি শর্ত পরীক্ষা করুন: Background Fetch ক্যাপাবিলিটি Xcode-এ সক্রিয় আছে, minimumBackgroundFetchInterval নির্ধারণ করা হয়েছে, এবং ব্যবহারকারী সেটিংসে অ্যাপের জন্য Background App Refresh নিষ্ক্রিয় করেননি। এছাড়া ডিভাইস লো পাওয়ার মোডে নেই এবং ব্যাটারি লেভেল 20% এর উপরে কিনা পরীক্ষা করুন।
Background Fetch পুরানো API (iOS 7), BGAppRefreshTask নতুন API (iOS 13+)। BGAppRefreshTask আরও নিয়ন্ত্রণ প্রদান করে: expiration হ্যান্ডলার, পুনঃনির্ধারণ ক্ষমতা এবং স্ট্যাটাস পরীক্ষা। Background Fetch বাস্তবায়নে সহজ কিন্তু কম নমনীয়। Apple নতুন প্রকল্পের জন্য BGAppRefreshTask ব্যবহারের সুপারিশ করে।
সুপারিশ করা হয় না। Background Fetch সময়-সীমাবদ্ধ (30 সেকেন্ড পর্যন্ত)। বড় ডাউনলোডের জন্য, ব্যাকগ্রাউন্ড কনফিগারেশনসহ URLSession ব্যবহার করুন — সিস্টেম fetch শেষ হওয়ার পরও ডাউনলোড চালিয়ে যাবে। বিকল্প হলো BGProcessingTask (iOS 13+), যা 10 মিনিট পর্যন্ত এবং চার্জিং শর্ত অনুমোদন করে।
হ্যাঁ, প্রতিটি জাগরণ প্রসেসর চালু করতে, নেটওয়ার্ক স্ট্যাক শুরু করতে এবং ডেটা লোড করতে শক্তি খরচ করে। iOS ফ্রিকোয়েন্সি অপটিমাইজ করে প্রভাব কমানোর জন্য। সঠিক বাস্তবায়নে — শুধুমাত্র নতুন ডেটা লোড করা, দ্রুত কমপ্লিশন হ্যান্ডলার কল — ব্যাটারিতে প্রভাব ন্যূনতম।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন