Privacy Manifest (PrivacyInfo.xcprivacy) হল একটি ফাইল যা সমস্ত অ্যাপ্লিকেশন এবং তৃতীয় পক্ষের SDK-কে 2024 সালের বসন্ত থেকে iOS বিল্ডে অন্তর্ভুক্ত করতে হবে। Apple প্রয়োজনীয় API (Required Reason API) ব্যবহারের কারণ এবং সংগ্রহ করা ডেটার ধরন ঘোষণা করার প্রয়োজন। Apple ডেভেলপার ডকুমেন্টেশন অনুসারে, অ্যাপ্লিকেশনের মধ্যে প্রতিটি বাইনারি — প্রধান টার্গেট, ফ্রেমওয়ার্ক, Swift Package Manager নির্ভরতা — তার নিজস্ব Privacy Manifest থাকতে হবে।
মূল বিষয়
Privacy Manifest হল একটি PrivacyInfo.xcprivacy ফাইল যা property list (XML) ফরম্যাটে ঘোষণা করে যে অ্যাপ্লিকেশন কী ধরনের ডেটা সংগ্রহ করে এবং কেন এটি নির্দিষ্ট API ব্যবহার করে। Apple গোপনীয়তা স্বচ্ছতা বাড়ানোর উদ্যোগের অংশ হিসেবে ম্যানিফেস্ট চালু করেছে, যা Privacy Nutrition Label-এর মতো কিন্তু কোড এবং বাইনারি স্তরে।
ম্যানিফেস্টের মূল উদ্দেশ্য হল তথাকথিত Required Reason API-এর ব্যবহার নথিভুক্ত করা। এগুলি হল API বিভাগ যা ডিভাইসের ডিজিটাল ফিঙ্গারপ্রিন্টিং-এর জন্য ব্যবহার করা যেতে পারে, তাই প্রতিটি ব্যবহারের সাথে Apple-এর অনুমোদিত তালিকা থেকে একটি নির্দিষ্ট কারণের ঘোষণা থাকতে হবে।
1 মে 2024 থেকে, Apple Privacy Manifest নেই এমন বিল্ড প্রত্যাখ্যান করে। এটি অ্যাপ্লিকেশনের প্রধান টার্গেট এবং সমস্ত এমবেডেড SDK ও নির্ভরতা উভয়ের ক্ষেত্রেই প্রযোজ্য। WWDC 2023 অনুসারে, App Store-এর মাধ্যমে বিতরণ করা সমস্ত অ্যাপ্লিকেশনের জন্য ম্যানিফেস্ট বাধ্যতামূলক।
ম্যানিফেস্ট প্রতিটি বাইনারিতে উপস্থিত থাকতে হবে — শুধুমাত্র প্রধান অ্যাপ্লিকেশনেই নয় বরং প্রতিটি ফ্রেমওয়ার্ক এবং স্ট্যাটিক লাইব্রেরিতেও। যদি কোনো তৃতীয় পক্ষের SDK ম্যানিফেস্ট সরবরাহ না করে, তাহলে ডেভেলপারকে এটি ম্যানুয়ালি যোগ করতে হবে অথবা আপডেটের জন্য SDK বিক্রেতার সাথে যোগাযোগ করতে হবে।
ম্যানিফেস্টের আগে, ডেভেলপাররা স্বচ্ছ ব্যাখ্যা ছাড়াই বিস্তৃত সিস্টেম API (ফাইল সিস্টেম অ্যাক্সেস, তারিখ/সময়, সিস্টেম লগ) ব্যবহার করতে পারত। এটি তৃতীয় পক্ষের SDK-এর মাধ্যমে ডেটা ফাঁসের ঝুঁকি তৈরি করত যা ডেভেলপারের অজান্তে তথ্য সংগ্রহ করতে পারত।
Mysk Inc. (2023)-এর মতে, অনেক জনপ্রিয় SDK স্পষ্ট প্রয়োজন ছাড়াই ডিভাইস ফিঙ্গারপ্রিন্টিং-এর জন্য API ব্যবহার করত — উদাহরণস্বরূপ, সময় অঞ্চল নির্ধারণের জন্য আপটাইম পড়া বা মেটাডেটা সংগ্রহের জন্য ডিরেক্টরি স্ক্যান করা। Privacy Manifest এই ধরনের প্রতিটি কাজ ঘোষণা করতে বাধ্য করে।
Required Reason API ছাড়াও, ম্যানিফেস্টে NSPrivacyTracking বিভাগ অন্তর্ভুক্ত রয়েছে — একটি ফ্ল্যাগ যা নির্দেশ করে যে অ্যাপ ট্র্যাকিং ব্যবহার করে কিনা (ATT প্রয়োজন), এবং NSPrivacyCollectedDataTypes — Privacy Nutrition Label ফরম্যাটে সংগ্রহ করা ডেটার প্রকারের তালিকা।
Privacy Nutrition Label হল App Store-এ অ্যাপ্লিকেশন পৃষ্ঠায় ব্যবহারকারীর মুখোমুখি উপস্থাপনা, যা দেখায় যে অ্যাপ কী ডেটা সংগ্রহ করে। Privacy Manifest হল বাইনারির ভিতরের একটি প্রযুক্তিগত ফাইল যা Apple স্বয়ংক্রিয়ভাবে পরীক্ষা করে। যদি ম্যানিফেস্টের ডেটা App Store Connect-এর লেবেলের সাথে মেলে না, তাহলে Apple বিল্ড প্রত্যাখ্যান করে।
সুতরাং, ম্যানিফেস্ট হল Apple-এর যাচাইকরণ ব্যবস্থার জন্য সত্যের উৎস। এর ভিত্তিতে গোপনীয়তা লেবেল স্বয়ংক্রিয়ভাবে তৈরি হয়, কিন্তু ডেভেলপারকে উভয় উপস্থাপনা আপডেট রাখতে হবে। প্রকাশের পর ম্যানিফেস্ট পরিবর্তন করতে পর্যালোচনার জন্য নতুন বিল্ড জমা দিতে হবে।
PrivacyInfo.xcprivacy ফাইলটি property list ফরম্যাট ব্যবহার করে যার মূল ধরন Dictionary। প্রধান শীর্ষ-স্তরের কীগুলি হল: NSPrivacyTracking (Boolean), NSPrivacyTrackingDomains (Array), NSPrivacyCollectedDataTypes (Array), NSPrivacyAccessedAPITypes (Array)।
NSPrivacyTracking কী — একটি বুলিয়ান মান যা নির্দেশ করে যে অ্যাপ ট্র্যাকিং প্রয়োগ করে কিনা (ATT প্রয়োজন)। যদি true হয়, তাহলে Info.plist-এ NSUserTrackingUsageDescription-ও উল্লেখ করতে হবে। NSPrivacyTrackingDomains কী — ডোমেনের একটি অ্যারে যেখানে ট্র্যাকিং প্রয়োগ করা হয়।
NSPrivacyCollectedDataTypes কী — অভিধানের একটি অ্যারে, প্রতিটি সংগ্রহ করা ডেটার প্রকার বর্ণনা করে: বিভাগ (NSPrivacyCollectedDataType), সংযোগ (NSPrivacyCollectedDataLinked), উদ্দেশ্য (NSPrivacyCollectedDataTypePurposes)। উদ্দেশ্যগুলির মধ্যে রয়েছে: তৃতীয় পক্ষের বিজ্ঞাপন, বিশ্লেষণ, পণ্য উন্নয়ন এবং বিষয়বস্তু ব্যক্তিগতকরণ।
NSPrivacyAccessedAPITypes কী — প্রতিটি Required Reason API বিভাগের জন্য অভিধানের একটি অ্যারে: বিভাগ (NSPrivacyAccessedAPITypeReasons) — Apple-এর অনুমোদিত তালিকা থেকে একটি নির্দিষ্ট কারণ, এবং NSPrivacyAccessedAPIType — API বিভাগ শনাক্তকারী।
<!-- PrivacyInfo.xcprivacy -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
ডেটার প্রকারগুলি কয়েকটি বিভাগে বিভক্ত: যোগাযোগের তথ্য (নাম, ইমেল, ফোন), অর্থ (পেমেন্ট ডেটা), শনাক্তকারী (IDFA, ব্যবহারকারী আইডি), ব্যবহারের ডেটা (লগ, ক্লিক), ডায়াগনস্টিকস (ক্র্যাশ লগ) এবং ব্যবহারকারী বিষয়বস্তু (ছবি, ভিডিও, ফাইল)। প্রতিটি বিভাগ অতিরিক্তভাবে «ব্যবহারকারীর সাথে সংযুক্ত» বা «সংযুক্ত নয়» হিসাবে চিহ্নিত করা হয়।
সংযুক্ত মানে ডেটা ব্যবহারকারীর অ্যাকাউন্টের সাথে যুক্ত; সংযুক্ত নয় মানে ডেটা একত্রিত বা বেনামী করা হয়েছে। এই চিহ্নিতকরণ প্রভাবিত করে যে Apple কীভাবে গোপনীয়তা লেবেল প্রদর্শন করে: সংযুক্ত ডেটা হলুদ রঙে চিহ্নিত হয়, সংযুক্ত নয় — সবুজ রঙে।
Apple বেশ কয়েকটি API বিভাগ চিহ্নিত করেছে, প্রতিটির ব্যবহার অনুমোদিত তালিকা থেকে একটি নির্দিষ্ট কারণের সাথে হতে হবে। কারণ হল একটি অনন্য কোড, উদাহরণস্বরূপ C617.1 বা 35F9.1, যা Apple-এর অনুমোদিত একটি নির্দিষ্ট উদ্দেশ্যের সাথে মিলে যায়।
NSPrivacyAccessedAPICategoryFileTimestamp বিভাগে ফাইল টাইমস্ট্যাম্প (creationDate, modificationDate) অ্যাক্সেস করার জন্য API অন্তর্ভুক্ত রয়েছে। কারণ: C617.1 (ফাইল সিঙ্ক্রোনাইজেশন), 3B52.1 (ব্যাকআপ), 0A2A.1 (অ্যান্টিফ্রড)।
NSPrivacyAccessedAPICategoryDiskSpace বিভাগে ডিস্কের খালি স্থান পরীক্ষা করার জন্য API অন্তর্ভুক্ত রয়েছে (NSFileManager. পরীক্ষা (NSFileManager)। কারণ: E174.1 (ক্যাশ ব্যবস্থাপনা), 85F4.1 (কন্টেন্ট ডাউনলোড), B728.1 (ডায়াগনস্টিকস)।
NSPrivacyAccessedAPICategorySystemBootTime বিভাগে সিস্টেম বুট সময় (আপটাইম) অ্যাক্সেস করার জন্য API অন্তর্ভুক্ত রয়েছে। শুধুমাত্র একটি কারণ: 35F9.1 (বিশ্লেষণের জন্য সেশন সময় মাপা)। অন্য কোনো ব্যবহার ফিঙ্গারপ্রিন্টিং হিসাবে গণ্য হয়।
প্রতিটি বিভাগে 1 থেকে 5টি অনুমোদিত কারণ রয়েছে। ডেভেলপারকে API-এর প্রকৃত ব্যবহারের সাথে সবচেয়ে বেশি মেলে এমন কারণ নির্বাচন করতে হবে। ভুল কারণ প্রদান করলে বিল্ড প্রত্যাখ্যান বা অ্যাকাউন্ট নিষেধাজ্ঞা হতে পারে।
1 মে 2024 থেকে, সমস্ত তৃতীয় পক্ষের SDK — বাইনারি এবং ওপেন সোর্স উভয়ই — তাদের প্যাকেজে Privacy Manifest অন্তর্ভুক্ত করতে বাধ্য। Apple সমস্ত নির্ভরতার জন্য ম্যানিফেস্ট পরীক্ষা করে এবং যদি অন্তত একটি SDK-এর ম্যানিফেস্ট না থাকে, তাহলে বিল্ড প্রত্যাখ্যান করা হবে।
প্রধান SDKগুলি (Firebase, Adjust, AppsFlyer, Facebook SDK) ইতিমধ্যে তাদের প্যাকেজ আপডেট করেছে। যদি আপনার প্রকল্প একটি অল্প পরিচিত SDK ব্যবহার করে, তবে এর সংস্করণ পরীক্ষা করুন এবং প্রয়োজনে আপডেট করুন বা ডেভেলপারের সাথে যোগাযোগ করুন। একটি অস্থায়ী সমাধান হল প্রকল্পে SDK-এর জন্য ম্যানুয়ালি ম্যানিফেস্ট যোগ করা, কিন্তু আপডেটের সময় অসঙ্গতির কারণে এটি সুপারিশ করা হয় না।
আপনি Xcode 15+-এ অন্তর্নির্মিত টেমপ্লেটের মাধ্যমে বা ম্যানুয়ালি PrivacyInfo.xcprivacy তৈরি করতে পারেন। উভয় বিকল্প বিবেচনা করা যাক।
Xcode 15-এ একটি Privacy Manifest টেমপ্লেট অন্তর্ভুক্ত রয়েছে: File → New → File → Resource → Privacy Manifest। Xcode মৌলিক কাঠামো সহ একটি ফাইল তৈরি করে এবং NSPrivacyTracking এবং API ও ডেটার জন্য খালি অ্যারে পূরণ করে। তৈরির পরে, আপনাকে প্রতিটি ব্যবহৃত Required Reason API-এর জন্য ম্যানুয়ালি কারণ নির্দেশ করতে হবে।
টেমপ্লেট স্বয়ংক্রিয়ভাবে ফাইলটি প্রধান টার্গেটে যোগ করে। যদি প্রকল্পে একাধিক টার্গেট থাকে (Extensions, Watch app), তাহলে আপনাকে প্রতিটিতে ম্যানিফেস্ট যোগ করতে হবে। Xcode কম্পাইল সময়ে নির্ভরতাগুলিতে ম্যানিফেস্টের উপস্থিতি পরীক্ষা করে না — শুধুমাত্র আর্কাইভিং পর্যায়ে।
// AppDelegate: ডেভেলপমেন্ট পর্যায়ে ম্যানিফেস্ট পরীক্ষা
import Foundation
func validatePrivacyManifest() {
guard let path = Bundle.main.path(
forResource: "PrivacyInfo", ofType: "xcprivacy"
) else {
print("PrivacyInfo.xcprivacy পাওয়া যায়নি")
return
}
guard let dict = NSDictionary(contentsOfFile: path)
else { return }
print("Privacy manifest loaded: \(dict.count) keys")
}
আপনি PrivacyInfo.xcprivacy ম্যানুয়ালি একটি সাধারণ XML property list ফাইল হিসাবে তৈরি করতে পারেন। এটি করতে, PrivacyInfo.xcprivacy নামে একটি ফাইল তৈরি করুন, স্ট্যান্ডার্ড plist হেডার লিখুন এবং প্রয়োজনীয় কী সহ একটি রুট ডিকশনারি যোগ করুন। নিশ্চিত করুন যে ফাইলটি টার্গেটে যোগ করা হয়েছে (Target Membership)।
ম্যানুয়াল পদ্ধতি উপযোগী যখন আপনাকে Xcode UI ব্যবহার না করে একটি স্ট্যাটিক লাইব্রেরি বা Package Manager নির্ভরতায় ম্যানিফেস্ট যোগ করতে হবে। কম্পাইলেশনের পরে, nm কমান্ড বা আর্কাইভিং-এর মাধ্যমে নিশ্চিত করুন যে ফাইলটি বাইনারিতে অন্তর্ভুক্ত হয়েছে।
App Store-এ বিল্ড জমা দেওয়ার আগে, আপনাকে নিশ্চিত করতে হবে যে Privacy Manifest সঠিক এবং সম্পূর্ণ। Apple বেশ কয়েকটি যাচাইকরণ সরঞ্জাম সরবরাহ করে।
প্রকল্প আর্কাইভ করার সময় (Product → Archive), Xcode ম্যানিফেস্ট যাচাই করে। যদি কোনো ত্রুটি পাওয়া যায় — ম্যানিফেস্ট অনুপস্থিত, ভুল কারণ, খালি বিভাগ — আর্কাইভিং ত্রুটি সহ ব্যর্থ হয়। ত্রুটি লগ Issue navigator-এ প্রদর্শিত হয়, সমস্যাযুক্ত SDK এবং API বিভাগ নির্দেশ করে।
বিল্ড আপলোড করার সময় App Store Connect-এর পক্ষ থেকে অতিরিক্ত যাচাইকরণ করা হয়। যদি যাচাই ব্যর্থ হয়, তাহলে বিল্ডটি সমস্যাযুক্ত API-এর শনাক্তকারী এবং প্রস্তাবিত সমাধান সম্বলিত একটি স্বয়ংক্রিয় ইমেল সহ প্রত্যাখ্যান করা হয়।
যাচাইকরণ স্বয়ংক্রিয় করতে, এমন স্ক্রিপ্ট ব্যবহার করুন যা Required Reason API ব্যবহারের জন্য বাইনারি বিশ্লেষণ করে। Apple libtool টুল এবং প্রতীক যাচাই স্ক্রিপ্ট সরবরাহ করে, কিন্তু সম্প্রদায় আরও সুবিধাজনক ইউটিলিটি তৈরি করেছে।
# বাইনারিতে FileTimestamp API ব্যবহারের অনুসন্ধান
nm MyApp.app/MyApp | grep "NSFileCreationDate"
# অ্যাপ্লিকেশনে PrivacyInfo.xcprivacy-এর উপস্থিতি পরীক্ষা
find MyApp.app -name "*.xcprivacy"
সবচেয়ে সাধারণ ত্রুটি হল একটি SDK-তে ম্যানিফেস্টের অনুপস্থিতি। এমনকি যদি প্রধান টার্গেটে ম্যানিফেস্ট থাকে, Apple প্রতিটি বাইনারি পৃথকভাবে পরীক্ষা করে। দ্বিতীয় সবচেয়ে সাধারণ ত্রুটি হল ভুল কারণ কোড — একটি API বিভাগের জন্য অন্য বিভাগের API-এর সাথে কারণ ব্যবহার করা।
তৃতীয় ত্রুটি হল API-গুলির অতিরিক্ত ঘোষণা যা আসলে ব্যবহার করা হয় না। ডেভেলপাররা «যদি কাজে লাগে» এই ভেবে সমস্ত সম্ভাব্য কারণ যোগ করে, যা Apple পর্যালোচকদের সন্দেহের সৃষ্টি করে। শুধুমাত্র সেই বিভাগগুলি যোগ করুন যা প্রকৃতপক্ষে ব্যবহার করা হয়। যাচাই করতে Xcode স্ট্যাটিক বিশ্লেষক ব্যবহার করুন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
1 মে 2024 থেকে, Apple ম্যানিফেস্ট ছাড়া যেকোনো বিল্ড প্রত্যাখ্যান করে। ত্রুটিটি App Store Connect-এ আপলোডের পর্যায়ে ঘটে। পুরানো অ্যাপ্লিকেশনগুলি ব্লক করা হয় না, কিন্তু আপডেটের জন্য ম্যানিফেস্টের বাধ্যতামূলক অন্তর্ভুক্তি প্রয়োজন।
হ্যাঁ, ম্যানিফেস্ট সমস্ত Apple প্ল্যাটফর্মের জন্য বাধ্যতামূলক: iOS, iPadOS, macOS, tvOS, watchOS এবং visionOS। Required Reason API-র প্রয়োজনীয়তা সমস্ত প্ল্যাটফর্মের জন্য অভিন্ন, যদিও API সেটগুলি সামান্য ভিন্ন হতে পারে।
যদি SDK ম্যানিফেস্ট সরবরাহ না করে, তাহলে একটি আলাদা PrivacyInfo.xcprivacy ফাইল তৈরি করুন এবং প্রকল্পে SDK গ্রুপে এটি যোগ করুন। SDK-এর ডকুমেন্টেশন-এর ভিত্তিতে এই SDK-এর ব্যবহৃত API-গুলির জন্য কারণ নির্দেশ করুন।
হ্যাঁ। স্বয়ংক্রিয় যাচাইয়ের সময়, Apple ঘোষিত কারণগুলির মিল পরীক্ষা করে প্রকৃত API কলের সাথে। অমিল প্রত্যাখ্যানের দিকে নিয়ে যায়। ম্যানুয়াল পর্যালোচনার সময়, পর্যালোচক স্পষ্টীকরণের অনুরোধ করতে পারেন।
হ্যাঁ, Apple SPM সহ সমস্ত নির্ভরতার জন্য ম্যানিফেস্ট যাচাই করে। প্যাকেজ সরবরাহকারীরা তাদের রিপোজিটরিতে PrivacyInfo.xcprivacy অন্তর্ভুক্ত করতে বাধ্য। Xcode আর্কাইভিংয়ের সময় অনুপস্থিত ম্যানিফেস্ট সম্পর্কে সতর্ক করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন