Info.plist Usage Description হল iOS অ্যাপের Info.plist ফাইলে বাধ্যতামূলক কী যা সিস্টেম ফিচার: ক্যামেরা, মাইক্রোফোন, জিওলোকেশন, ফটো অ্যালবাম এবং অন্যান্যগুলিতে অ্যাক্সেসের অনুরোধ করার সময় ব্যবহারকারীকে দেখানো টেক্সট ধারণ করে। প্রতিটি কী-তে NS*UsageDescription উপসর্গ থাকে এবং অ্যাক্সেস অনুরোধের কারণ ব্যাখ্যা করার একটি স্ট্রিং প্রদান করে। Apple Information Property List Guide অনুসারে, অনুরোধকৃত রিসোর্সের জন্য কী-এর অনুপস্থিতি অ্যাপটি তাৎক্ষণিকভাবে ক্র্যাশ করে দেয়।
মূল বিষয়
Info.plist Usage Description হল NS*UsageDescription উপসর্গযুক্ত কীগুলির স্ট্রিং মান যা iOS-এর সুরক্ষিত রিসোর্সে অ্যাক্সেসের অনুরোধ করার সময় সিস্টেম ডায়ালগের টেক্সট নির্ধারণ করে। যখন কোনো অ্যাপ প্রথমবার এমন একটি API কল করে যার জন্য ব্যবহারকারীর অনুমতি প্রয়োজন (যেমন, ক্যামেরার জন্য AVCaptureDevice), iOS এই টেক্সট এবং অনুমতি/অস্বীকার বাটন সহ একটি ডায়ালগ দেখায়।
বিবরণ টেক্সট হল একমাত্র জিনিস যা ডেভেলপার সিস্টেম ডায়ালগে নিয়ন্ত্রণ করতে পারে। ডায়ালগের শিরোনাম “<অ্যাপের নাম> [রিসোর্স] অ্যাক্সেস করতে চায়” iOS দ্বারা অনুরোধকৃত রিসোর্সের ধরণের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে তৈরি হয়। ডেভেলপার শিরোনাম, বাটন বা চেহারা পরিবর্তন করতে পারে না — কেবল ব্যাখ্যামূলক টেক্সট।
Usage Description iOS-এ রানটাইম অনুমতি মডেলের সাথে ঘনিষ্ঠভাবে সম্পর্কিত। ব্যবহারকারী একটি অনুরোধের জন্য অনুমতি দেয়, যা পরে সেটিংসের মাধ্যমে প্রত্যাহার করা যেতে পারে। পরবর্তী অনুরোধে, ডায়ালগ আবার দেখানো হয় না — অ্যাপকে অনুমতির স্থিতি পরীক্ষা করতে হবে এবং সেই অনুযায়ী প্রতিক্রিয়া জানাতে হবে।
Apple দৃঢ়ভাবে সুপারিশ করে যে বিবরণে অ্যাক্সেস অনুরোধের একটি নির্দিষ্ট কারণ উল্লেখ করা উচিত। উদাহরণস্বরূপ, “প্রোফাইল ফটো তোলার জন্য” “ক্যামেরা অ্যাক্সেস করার জন্য” থেকে ভালো। নির্দিষ্ট টেক্সট ব্যবহারকারীর আস্থা এবং অনুমতি দেওয়ার হার বাড়ায়। Localytics (2023) অনুসারে, কাস্টম বিবরণ সাধারণ শব্দের তুলনায় সম্মতি 15-25% বাড়ায়।
NS*UsageDescription-কে ATT (App Tracking Transparency) এর সাথে গুলিয়ে ফেলবেন না। Usage Description হল সিস্টেম রিসোর্স (ক্যামেরা, জিওলোকেশন, ফটো) অ্যাক্সেসের অনুরোধ, যেখানে ATT হল ট্র্যাকিং (IDFA অ্যাক্সেস) এর অনুরোধ। ATT একটি পৃথক ফ্রেমওয়ার্ক AppTrackingTransparency এবং NSUserTrackingUsageDescription কী ব্যবহার করে, যা NS*UsageDescription-এর অংশ নয়।
তাদের মধ্যে মিল হল যে উভয়ই সিস্টেম ডায়ালগ ব্যবহার করে যার টেক্সট অ্যাপ পরিবর্তন করতে পারে না। পার্থক্য হল যে Usage Description রিসোর্স স্তরে কাজ করে, যেখানে ATT ডিভাইস আইডেন্টিফায়ার স্তরে কাজ করে। NS*UsageDescription কীগুলি iOS 6-এ চালু হয়েছিল, ATT — iOS 14.5-এ।
প্রত্যেক iOS রিলিজের সাথে, Apple নতুন সুরক্ষিত রিসোর্স এবং সংশ্লিষ্ট কী যুক্ত করেছে। iOS 6: কন্টাক্ট, ক্যালেন্ডার, রিমাইন্ডার, ফটো। iOS 7: মাইক্রোফোন। iOS 8: HomeKit, স্বাস্থ্য। iOS 10: মিডিয়া লাইব্রেরি, Siri। iOS 11: NFC। iOS 14: ট্র্যাকিং (ATT)। iOS 17: ক্লিপবোর্ড অ্যাক্সেস (অতিরিক্ত নিশ্চিতকরণ প্রয়োজন)।
গুরুত্বপূর্ণ: যদি অ্যাপ একটি নির্দিষ্ট iOS সংস্করণে চালু হওয়া API ব্যবহার করে কিন্তু ন্যূনতম সমর্থিত সংস্করণ কম হয়, তবুও কীটি বাধ্যতামূলক। iOS প্রথম API কলের আগে কী-এর উপস্থিতি পরীক্ষা করে, অ্যাপটি কোন সংস্করণে চলছে তা নির্বিশেষে।
কীগুলির সম্পূর্ণ তালিকা নির্ভর করে অ্যাপটি কোন ফিচারগুলি ব্যবহার করে তার উপর। চলুন মোবাইল অ্যাপে সবচেয়ে বেশি প্রয়োজনীয় ১৪টি প্রধান কী পর্যালোচনা করি।
NSCameraUsageDescription কী AVCaptureDevice বা .camera উৎস সহ UIImagePickerController-এর মাধ্যমে ক্যামেরা অ্যাক্সেস করার সময় বাধ্যতামূলক। NSMicrophoneUsageDescription কী AVAudioRecorder-এর মাধ্যমে অডিও রেকর্ড করার বা শব্দ সহ ভিডিও শুট করার সময় প্রয়োজন। অ্যাপ ভিডিও রেকর্ড করলে প্রায়ই উভয় কী একসাথে প্রয়োজন হয়।
NSPhotoLibraryUsageDescription কী PHPicker বা UIImagePickerController-এর মাধ্যমে ব্যবহারকারীর মিডিয়া লাইব্রেরি থেকে ফটো এবং ভিডিও পড়ার সময় ব্যবহৃত হয়। NSPhotoLibraryAddUsageDescription কী ব্যবহার করা হয় যদি অ্যাপ শুধু ফটো সেভ করে কিন্তু পড়ে না। প্রথমটি পড়ার অনুমতি চায়, দ্বিতীয়টি — শুধু লেখার।
NSLocationWhenInUseUsageDescription কী অ্যাপ সক্রিয় থাকাকালীন (স্ক্রিনে) জিওলোকেশন অ্যাক্সেস প্রদান করে। NSLocationAlwaysAndWhenInUseUsageDescription সর্বদা অ্যাক্সেস প্রদান করে (ব্যাকগ্রাউন্ড মোড সহ)। সর্বদা অ্যাক্সেস প্রয়োজন হলে iOS উভয় কী চায়: প্রথমে WhenInUse, তারপর Always।
NSLocationTemporaryUsageDescription এবং NSLocationPreciseUsageDescription কীগুলি অস্থায়ী অ্যাক্সেস বা সঠিক জিওলোকেশন অনুরোধের জন্য অতিরিক্ত কী। সঠিক অবস্থানের জন্য পৃথক অনুমতি প্রয়োজন, এবং ব্যবহারকারী শুধু আনুমানিক অবস্থান সক্ষম করতে পারে।
| কী | রিসোর্স | iOS থেকে উপলব্ধ |
|---|---|---|
| NSCameraUsageDescription | ক্যামেরা | 6.0 |
| NSMicrophoneUsageDescription | মাইক্রোফোন | 7.0 |
| NSPhotoLibraryUsageDescription | মিডিয়া লাইব্রেরি (পড়া) | 6.0 |
| NSPhotoLibraryAddUsageDescription | মিডিয়া লাইব্রেরি (লেখা) | 11.0 |
| NFCReaderUsageDescription | NFC | 11.0 |
NSContactsUsageDescription কী CNContactStore-এর মাধ্যমে ব্যবহারকারীর কন্টাক্টে অ্যাক্সেস প্রদান করে। NSCalendarsUsageDescription ইভেন্ট পড়া এবং তৈরি করার জন্য ক্যালেন্ডার অ্যাক্সেস প্রদান করে। NSRemindersUsageDescription রিমাইন্ডারে অ্যাক্সেস প্রদান করে। NSBluetoothAlwaysUsageDescription ব্যাকগ্রাউন্ডে Bluetooth অ্যাক্সেস প্রদান করে (যেমন, BLE ডিভাইসের জন্য)।
NSHealthShareUsageDescription কী HealthKit ডেটা পড়ার অ্যাক্সেস প্রদান করে। NSHealthUpdateUsageDescription HealthKit-এ ডেটা লেখার অ্যাক্সেস প্রদান করে। অ্যাপ স্বাস্থ্য ডেটা নিয়ে কাজ করলে উভয়ই বাধ্যতামূলক। Apple HealthKit ব্যবহার করা অ্যাপগুলি সাবধানে পর্যালোচনা করে এবং ব্যবহারের বিবরণ কার্যকারিতার সাথে না মিললে অ্যাপ প্রত্যাখ্যান করতে পারে।
Usage Description-এ টেক্সট নির্দিষ্ট, সত্য এবং সংক্ষিপ্ত হতে হবে। Apple শব্দচয়নের উপর সুপারিশ প্রদান করে, এবং পর্যালোচকরা কার্যকারিতার সাথে সঙ্গতি পরীক্ষা করেন।
একটি ভালো বিবরণ তিনটি অংশ নিয়ে গঠিত: অ্যাপ রিসোর্স দিয়ে ঠিক কী করে, ব্যবহারকারীর কেন এটি প্রয়োজন, এবং অ্যাক্সেস প্রদান করে ব্যবহারকারী কী সুবিধা পায়। উদাহরণ: “প্রোফাইল ফটো তোলার এবং আপনার প্রোফাইলে আপলোড করার জন্য।” সাধারণ বাক্যাংশ এড়িয়ে চলুন: “অ্যাপের কর্মক্ষমতা উন্নত করতে” কেন ক্যামেরা প্রয়োজন তা ব্যাখ্যা করে না।
Apple বিভ্রান্তিকর বিবরণ নিষিদ্ধ করে। যদি “ফটো তোলার জন্য” লেখা থাকে কিন্তু অ্যাপ ভিডিওও রেকর্ড করে, এটি প্রতারণামূলক বলে বিবেচিত হতে পারে। পর্যালোচক অ্যাপ প্রত্যাখ্যান করতে পারে বা স্পষ্টীকরণ চাইতে পারে। iOS 17-এ, Apple স্বয়ংক্রিয় যাচাই যোগ করেছে: বিবরণে অনুরোধকৃত রিসোর্সের সাথে সঙ্গতিপূর্ণ কীওয়ার্ড থাকতে হবে।
স্থানীয়করণ: বিবরণ অ্যাপ সমর্থিত সব ভাষায় অনুবাদ করা আবশ্যক। যদি অ্যাপ ১০টি ভাষায় উপলব্ধ হয়, প্রতিটি Usage Description কী-এর Localizable.strings বা InfoPlist.strings ফাইলে অনুবাদ থাকতে হবে। Apple Info.plist কীগুলির স্থানীয়করণের জন্য InfoPlist.strings ব্যবহার করার সুপারিশ করে।
Usage Description স্থানীয়করণের জন্য প্রতিটি ভাষার জন্য Info.plist নকল করার প্রয়োজন নেই। প্রতিটি ভাষা ডিরেক্টরিতে InfoPlist.strings ফাইল তৈরি করুন এবং কী মান নির্ধারণ করুন। iOS ডায়ালগ দেখানোর সময় স্বয়ংক্রিয়ভাবে সঠিক ভাষা ব্যবহার করবে। Xcode সংস্করণ ১৪ থেকে Info.plist-এর জন্য বেস স্থানীয়করণ সমর্থন করে।
<!-- InfoPlist.strings (Russian) -->
"NSCameraUsageDescription" =
"QR কোড স্ক্যান করার জন্য";
"NSPhotoLibraryUsageDescription" =
"প্রোফাইলে ছবি আপলোড করার জন্য";
"NSLocationWhenInUseUsageDescription" =
"মানচিত্রে কাছের দোকান দেখানোর জন্য";
Usage Description-এর সঠিক বাস্তবায়নের মধ্যে Info.plist-এ কী যুক্ত করা, কোডে অনুমতির স্থিতি পরীক্ষা করা এবং অস্বীকার পরিচালনা করা অন্তর্ভুক্ত।
Xcode-এ, Info.plist খুলুন, একটি সারিতে হোভার করুন এবং “+” ক্লিক করুন। কী নাম লিখুন (যেমন, NSCameraUsageDescription) এবং বিবরণ স্ট্রিং নির্ধারণ করুন। Xcode কী নাম অটো-সম্পূর্ণ করে, যা টাইপোর ঝুঁকি কমায়। যুক্ত করার পর, প্রজেক্ট পুনর্নির্মাণ করুন এবং নিশ্চিত করুন যে কী চূড়ান্ত বাইনারিতে দেখা যাচ্ছে।
গুরুত্বপূর্ণ: কীগুলি কেস-সংবেদনশীল। NSCameraUsageDescription সঠিক, NSCamerausagedescription ভুল। ভুল কী উপেক্ষা করা হয়, এবং API কল করলে অ্যাপ ক্র্যাশ করবে। টাইপো এড়াতে Apple ডকুমেন্টেশন থেকে কপি করুন বা Xcode অটো-সম্পূর্ণ ব্যবহার করুন।
import AVFoundation
import Photos
final class PermissionManager {
static func checkCameraPermission() {
let status = AVCaptureDevice.authorizationStatus(for: .video)
switch status {
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { granted in
print("Camera access: \(granted)")
}
case .denied:
print("Camera access denied")
case .authorized:
print("Camera access authorized")
@unknown default:
break
}
}
static func requestPhotoLibraryAccess() {
PHPhotoLibrary.requestAuthorization { status in
print("Photo library status: \(status.rawValue)")
}
}
}
যদি ব্যবহারকারী অ্যাক্সেস অস্বীকার করে, অ্যাপের সিস্টেম ডায়ালগ আবার কল করা উচিত নয় — এটি সম্ভব নয়। পরিবর্তে, সেটিংসের মাধ্যমে কীভাবে অ্যাক্সেস সক্ষম করতে হয় তা ব্যাখ্যা করে একটি তথ্য স্ক্রিন দেখান, “সেটিংস খুলুন” বাটন (UIApplicationOpenSettingsURLString) সহ। এই অভ্যাস ব্যবহারকারীর অভিজ্ঞতা এবং ব্যবহারকারীর অ্যাক্সেস সক্ষম করার সম্ভাবনা উন্নত করে।
অস্বীকারের সাথে সাথেই অ্যাক্সেস সক্ষম করার জন্য অনুরোধ করা একটি সতর্কতা দেখাবেন না — ব্যবহারকারীকে বুঝতে সময় দিন কেন এই ফিচারের প্রয়োজন হতে পারে। এই অনুমতি প্রয়োজন এমন কার্যকারিতা ব্যবহারের চেষ্টা করার সময় ব্যাখ্যা দেখানো ভালো। UX Movement (2023) অস্বীকারের ২-৩ সেশনের পরে ব্যাখ্যা স্ক্রিন দেখানোর সুপারিশ করে।
func showSettingsAlert(for feature: String) {
let alert = UIAlertController(
title: "অ্যাক্সেস \(feature)",
message: "Allow access in Settings, "
+ "to use this feature",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(
title: "Open Settings",
style: .default
) { _ in
if let url = URL(string: UIApplication.openSettingsURLString) {
UIApplication.shared.open(url)
}
})
alert.addAction(UIAlertAction(
title: "Not now", style: .cancel
))
UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true)
}
বাধ্যতামূলক Usage Description কী-এর অনুপস্থিতি সংশ্লিষ্ট API-এর প্রথম কলে অ্যাপকে তাৎক্ষণিকভাবে ক্র্যাশ করে দেয়। এটি Xcode সতর্কতা নয়, বরং NSInvalidArgumentException এবং কনসোলে বার্তা সহ একটি রানটাইম ক্র্যাশ: “এই অ্যাপ ক্র্যাশ হয়েছে কারণ এটি ব্যবহারের বিবরণ ছাড়া গোপনীয়তা-সংবেদনশীল ডেটা অ্যাক্সেস করার চেষ্টা করেছে।”
iOS একটি সুরক্ষিত রিসোর্সের জন্য প্রথম API কলে Info.plist-এ NS*UsageDescription কী পরীক্ষা করে। যদি কী অনুপস্থিত থাকে, OS SIGABRT সংকেত দিয়ে অ্যাপটি তাৎক্ষণিকভাবে শেষ করে দেয়। এটি ডিবাগ ডিভাইসেও ঘটে — Xcode লগে ব্যতিক্রম দেখায়, কিন্তু ডিবাগার এটি ব্রেকপয়েন্ট হিসেবে ধরে না।
ক্র্যাশ প্রকৃত ডিভাইস এবং সিমুলেটরে পুনরুত্পাদনযোগ্য। এটি এড়ানোর একমাত্র উপায় API কল করার আগে কী যুক্ত করা। Xcode-এর স্ট্যাটিক বিশ্লেষক সবসময় অনুপস্থিত কী সম্পর্কে সতর্ক করে না, বিশেষ করে যদি API তৃতীয় পক্ষের SDK-এর মাধ্যমে কল করা হয়। TestFlight পরীক্ষকরাও ক্র্যাশ দেখবে, যা নেতিবাচক পর্যালোচনার দিকে নিয়ে যেতে পারে।
iOS 17+ সহ বিশেষ পরিস্থিতি: Apple ক্লিপবোর্ড অ্যাক্সেসের (UIPasteboard) জন্য অতিরিক্ত পরীক্ষা চালু করেছে। যদি অ্যাপ ব্যবহারকারীর স্পষ্ট কর্ম ছাড়া ক্লিপবোর্ড পড়ে, iOS একটি সতর্কতা ব্যানার দেখায়, এমনকি Usage Description কী উপস্থিত থাকলেও। ক্লিপবোর্ডের জন্য পৃথক কী প্রয়োজন নেই, তবে Apple স্বয়ংক্রিয় পড়া কমানোর সুপারিশ করে।
রানটাইম ক্র্যাশ ছাড়াও, কী-এর অনুপস্থিতি পর্যালোচনার সময় অ্যাপ প্রত্যাখ্যানের কারণ হতে পারে। Apple পর্যালোচনা পর্যায়ে Info.plist পরীক্ষা করে এবং সংশ্লিষ্ট কী ছাড়া API কল শনাক্ত করলে বিল্ড প্রত্যাখ্যান করতে পারে। Xcode আর্কাইভিং ব্লক করে না, কিন্তু App Store Connect বাইনারি প্রক্রিয়া করার সময় ত্রুটি ফেরত দিতে পারে।
যদি অ্যাপ সরাসরি রিসোর্স ব্যবহার না করে কিন্তু একটি তৃতীয় পক্ষের SDK করে (উদাহরণস্বরূপ, একটি অ্যানালিটিক্স SDK IDFA অনুরোধ করে), ডেভেলপারকে তবুও সংশ্লিষ্ট কী যোগ করতে হবে। Apple বাইনারিতে সমস্ত API কল পরীক্ষা করে, স্ট্যাটিক এবং ডায়নামিক লাইব্রেরির কোড সহ। ত্রুটি “Info.plist কী অনুপস্থিত” আপডেট প্রত্যাখ্যানের সবচেয়ে সাধারণ কারণগুলির মধ্যে একটি।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
হ্যাঁ, যদি তৃতীয় পক্ষের SDK রিসোর্স অ্যাক্সেস API (ক্যামেরা, জিওলোকেশন, ফটো) কল করে, কীটি বাধ্যতামূলক। iOS সম্পূর্ণ বাইনারি পরীক্ষা করে, নির্ভরতা সহ, এবং কী অনুপস্থিত থাকলে অ্যাপ ক্র্যাশ করে।
না, প্রতিটি সুরক্ষিত রিসোর্সের জন্য পৃথক কী প্রয়োজন। উদাহরণস্বরূপ, NSCameraUsageDescription NSMicrophoneUsageDescription-কে প্রতিস্থাপন করে না। সিস্টেম প্রতিটি API কল করার সময় নাম দ্বারা নির্দিষ্ট কী খোঁজে।
সেটিংস → অ্যাপের মাধ্যমে কীভাবে অ্যাক্সেস সক্ষম করতে হয় তা ব্যাখ্যা করে একটি স্ক্রিন দেখান এবং অ্যাপ সেটিংস খোলার জন্য একটি বাটন প্রদান করুন। সিস্টেম ডায়ালগ প্রোগ্রামেটিকভাবে পুনরায় ট্রিগার করা যাবে না।
প্রতিটি ভাষার জন্য InfoPlist.strings ফাইল তৈরি করুন এবং অনুবাদ নির্ধারণ করুন। iOS ডায়ালগ দেখানোর সময় স্বয়ংক্রিয়ভাবে ডিভাইসের ভাষা ব্যবহার করে। Xcode Info.plist-এর জন্য বেস স্থানীয়করণও সমর্থন করে।
iOS সিমুলেটর Usage Description পরীক্ষা সহ ডিভাইসের আচরণ সম্পূর্ণরূপে পুনরুত্পাদন করে। যদি কী অনুপস্থিত থাকে, সিমুলেটরও ব্যতিক্রম সহ অ্যাপ শেষ করবে। এটি প্রত্যাশিত ডিবাগিং আচরণ।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন