Action Extension হল একটি iOS এক্সটেনশন যা প্রসঙ্গ পরিবর্তন না করেই অন্যান্য অ্যাপ থেকে কন্টেন্টে কাস্টম কাজ সম্পাদন করে। Share Extension-এর বিপরীতে, যা অন্য অ্যাপে ডেটা পাঠায়, Action Extension কন্টেন্টকে সেখানেই রূপান্তর করে: টেক্সট অনুবাদ করে, ইমেজ ফিল্টার পরিবর্তন করে, বানান পরীক্ষা করে বা PDF জেনারেট করে। Apple (2024)-এর মতে, Action Extension হল Share Extension-এর পর দ্বিতীয় সর্বাধিক জনপ্রিয় এক্সটেনশনের ধরন, যা “উৎপাদনশীলতা” বিভাগের 42% অ্যাপে ব্যবহৃত হয়। মূল অ্যাপ চালু না করেই তাৎক্ষণিক কাজ করা ব্যবহারকারীর জন্য মূল সুবিধা।
মূল বিষয়
Action Extension হল এক ধরনের iOS অ্যাপ এক্সটেনশন যা হোস্ট অ্যাপের প্রসঙ্গের মধ্যেই সরাসরি কন্টেন্টে কাজ করতে দেয়। ব্যবহারকারী Safari-তে টেক্সট নির্বাচন করে, “ক্রিয়া”-এ ট্যাপ করে এবং উদাহরণস্বরূপ, “বানান পরীক্ষা করুন” বেছে নেয় — এক্সটেনশন টেক্সট প্রক্রিয়া করে এবং ব্রাউজার না ছেড়েই ফলাফল ফেরত দেয়। এক্সটেনশন ইনপুট ডেটা NSExtensionContext-এর মাধ্যমে গ্রহণ করে এবং পরিবর্তিত কন্টেন্ট ফেরত দিতে পারে।
Action Extension iOS 8-এ অ্যাপ এক্সটেনশন স্থাপত্যের অংশ হিসেবে আবির্ভূত হয়। এর মূল বৈশিষ্ট্য হল এক্সটেনশনের নিজস্ব কোনো ইন্টারফেস নেই (ঐচ্ছিক) এবং এটি হোস্ট অ্যাপের প্রসঙ্গে চলে। ব্যবহারকারী বর্তমান স্ক্রিন ছেড়ে যায় না, যা ন্যূনতম জ্ঞানীয় ঘর্ষণ নিশ্চিত করে। Apple-এর মতে, Action Extension হল একমাত্র এক্সটেনশনের ধরন যা একসঙ্গে হোস্ট অ্যাপের কন্টেন্ট পড়তে এবং পরিবর্তন করতে পারে (ফলাফল ফেরতসহ NSExtensionContext-এর মাধ্যমে)।
Action Extension বিভিন্ন পরিস্থিতিতে ব্যবহৃত হয়: ব্রাউজারে টেক্সট অনুবাদ, ওয়েব পৃষ্ঠা থেকে PDF তৈরি, গ্যালারিতে ফটোতে ফিল্টার প্রয়োগ, যেকোনো টেক্সট ফিল্ডে বানান পরীক্ষা, URL সংক্ষিপ্তকরণ, টেক্সট এনক্রিপশন এবং বুকমার্ক যোগ করা। বহুমুখিতা Action Extension-কে “ইউটিলিটি” এবং “উৎপাদনশীলতা” বিভাগের অ্যাপের জন্য একটি জনপ্রিয় টুল করে তোলে।
Action Extension এবং Share Extension প্রায়ই গুলিয়ে ফেলা হয়, কিন্তু তাদের উদ্দেশ্য মৌলিকভাবে ভিন্ন। Share Extension হোস্ট অ্যাপ থেকে আপনার অ্যাপে কন্টেন্ট পাঠায়; Action Extension কন্টেন্ট প্রক্রিয়া করে এবং ফেরত দেয়। পার্থক্য স্থাপত্য, ব্যবহারকারীর অভিজ্ঞতা এবং Info.plist কনফিগারেশনের প্রয়োজনীয়তাকে প্রভাবিত করে।
| বৈশিষ্ট্য | Action Extension | Share Extension |
|---|---|---|
| উদ্দেশ্য | কন্টেন্ট রূপান্তর | অ্যাপে কন্টেন্ট স্থানান্তর |
| ইন্টারফেস | ঐচ্ছিক (কাস্টম) | SLComposeServiceViewController |
| ডেটা ফেরত | হ্যাঁ, completeRequest-এর মাধ্যমে | না |
| প্রসঙ্গ | হোস্ট অ্যাপে থাকে | এক্সটেনশনে স্যুইচ করে |
| মেনু অবস্থান | Action Sheet (উপরের অংশ) | Share Sheet (নিচের অংশ) |
| সাধারণ কাজ | অনুবাদ, সংশোধন, ফিল্টার | সংরক্ষণ, প্রকাশনা |
“শেয়ার” বা “...” বাটনে ট্যাপ করলে Action Extension অ্যাকশন মেনুতে (Action Sheet) উপস্থিত হয়। iOS স্বয়ংক্রিয়ভাবে Action Extensions-কে শীটের উপরের অংশে (ক্রিয়া) এবং Share Extensions-কে নিচের অংশে (অ্যাপ) রাখে। ব্যবহারকারীর পরিস্থিতি: টেক্সট নির্বাচন করেছে → “ক্রিয়া”-এ ট্যাপ করেছে → আপনার Action Extension বেছে নিয়েছে → অ্যাপ পরিবর্তন না করেই প্রক্রিয়াকৃত ফলাফল পেয়েছে।
Action Extension-এ Xcode-এ একটি target, ইন্টারফেস প্রদর্শনের জন্য UIViewController (ঐচ্ছিক), ডেটা ইনপুট/আউটপুটের জন্য NSExtensionContext এবং Info.plist কনফিগারেশন থাকে। স্থাপত্য Share Extension-এর চেয়ে সরল: কোনো বাধ্যতামূলক কম্পোজ ইন্টারফেস নেই এবং এক্সটেনশন সম্পূর্ণরূপে UI ছাড়াই কাজ করতে পারে।
Target — মূল অ্যাপ থেকে প্রাপ্ত শনাক্তকারীসহ একটি পৃথক bundle। UIViewController — অগ্রগতি, সেটিংস বা ফলাফল প্রদর্শনের জন্য ঐচ্ছিক ইন্টারফেস। NSExtensionContext — ইনপুট ডেটা (inputItems) এবং ফলাফল ফেরতের জন্য completeRequest পদ্ধতিসহ একটি ধারক। Info.plist — NSExtensionActivationRule এবং সমর্থিত কন্টেন্ট ধরন নির্দিষ্ট করার জন্য বৈশিষ্ট্য (NSExtensionAttributes)-এর মাধ্যমে সক্রিয়করণ কনফিগারেশন।
Action Extension ইনপুট ডেটা extensionContext?.inputItems-এর মাধ্যমে গ্রহণ করে — NSExtensionItem-এর একটি অ্যারে। প্রতিটি আইটেমে ডেটা এবং UTI-সহ অ্যাটাচমেন্ট থাকে। প্রক্রিয়াকরণের পর, এক্সটেনশন আউটপুট NSExtensionItem-এর অ্যারে-সহ completeRequest(returningItems:) কল করে। হোস্ট অ্যাপ প্রক্রিয়াকৃত ডেটা গ্রহণ করে এবং প্রদর্শন করে। অ্যাসিঙ্ক্রোনাস মডেল: এক্সটেনশন 30 সেকেন্ড পর্যন্ত প্রসঙ্গ ধরে রেখে দীর্ঘস্থায়ী কাজ করতে পারে।
আসুন নির্বাচিত টেক্সট অনুবাদের জন্য Swift-এ Action Extension তৈরির বিষয়ে বিবেচনা করি। এক্সটেনশন হোস্ট অ্যাপ থেকে টেক্সট গ্রহণ করে, এটি একটি অনুবাদ সার্ভারে পাঠায় এবং ফলাফল ফেরত দেয়। ActionViewController হল মৌলিক কন্ট্রোলার যা Xcode target যোগ করার সময় তৈরি করে।
import UIKit
import MobileCoreServices
class ActionViewController: UIViewController {
@IBOutlet var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
extractTextAndTranslate()
}
func extractTextAndTranslate() {
guard let item = extensionContext?.inputItems.first
as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(
forTypeIdentifier: kUTTypePlainText as String
) { [weak self] (text, error) in
guard let inputText = text as? String else { return }
TranslationService().translate(inputText, from: "en", to: "ru") {
translated in
DispatchQueue.main.async {
self?.resultLabel?.text = translated
}
}
}
}
}
}
প্রক্রিয়াকরণের পর, এক্সটেনশন ফলাফল হোস্ট অ্যাপে ফেরত দেয়। আউটপুট ডেটা-সহ completeRequest একটি বিকল্প পরিস্থিতি যেখানে এক্সটেনশন UI দেখায় না বরং তাৎক্ষণিকভাবে প্রক্রিয়াকৃত কন্টেন্ট ফেরত দেয়।
// Returning processed text to host app
let resultItem = NSExtensionItem()
let resultData = translated.data(using: .utf8)!
let attachment = NSItemProvider(
item: resultData,
typeIdentifier: kUTTypePlainText as String
)
resultItem.attachments = [attachment]
extensionContext?.completeRequest(
returningItems: [resultItem], completionHandler: nil
)
Action Extension দুটি মোডে কাজ করতে পারে: UI-সহ এবং UI ছাড়া। UI ছাড়া মোডে, এক্সটেনশন সম্পূর্ণরূপে পটভূমিতে কাজ করে এবং প্রক্রিয়াকরণের পরপরই completeRequest কল করে। UI মোডে, এক্সটেনশন একটি কন্ট্রোলার দেখায়, ব্যবহারকারী কাজ নিশ্চিত করে এবং তারপরই completeRequest ফলাফল পাঠায়। মোড নির্বাচন কাজের জটিলতা এবং ব্যবহারকারীর ইনপুটের প্রয়োজনীয়তার উপর নির্ভর করে।
loadItem(forTypeIdentifier:) পদ্ধতি অ্যাসিঙ্ক্রোনাসভাবে কাজ করে — ডেটা বড় হতে পারে (ছবি, ভিডিও)। NSItemProvider স্ট্রিমিং এবং ক্যাশিং পরিচালনা করে। ছবির জন্য kUTTypeImage ব্যবহার করুন, ফাইলের জন্য kUTTypeFileURL ব্যবহার করুন। গুরুত্বপূর্ণ: loadItem পটভূমি থ্রেডে কল করা হতে পারে — শুধুমাত্র DispatchQueue.main-এর মাধ্যমে UI আপডেট করুন।
Action Extension NSExtensionItem-এর অ্যারে-সহ completeRequest-এর মাধ্যমে প্রক্রিয়াকৃত ডেটা ফেরত দেয়। প্রতিটি আইটেম আউটপুট ডেটা ধরনের সাথে মেলে। হোস্ট অ্যাপ মূল কন্টেন্টকে প্রক্রিয়াকৃত কন্টেন্ট দিয়ে প্রতিস্থাপন করতে পারে — উদাহরণস্বরূপ, মূল ছবিকে ফিল্টার করা ছবি দিয়ে প্রতিস্থাপন করা। NSExtensionItem ইনপুটের মতো একই UTI সমর্থন করে, plus অতিরিক্ত (যেমন, ওয়েব কন্টেন্টের জন্য public.html)।
Action Extension ডজন ডজন পরিস্থিতিতে ব্যবহৃত হয় — সাধারণ ইউটিলিটি থেকে জটিল ব্যবসায়িক ওয়ার্কফ্লো পর্যন্ত। শাস্ত্রীয় উদাহরণ টেক্সট, গ্রাফিক এবং ফাইল কার্যক্রমের পাশাপাশি ওয়েব কন্টেন্ট ইন্টিগ্রেশন কভার করে।
টেক্সটের জন্য Action Extension: অনুবাদ, বানান পরীক্ষা, অক্ষর গণনা, কেস পরিবর্তন, এনক্রিপশন, টেক্সট থেকে QR কোড তৈরি। ব্যবহারকারী যেকোনো অ্যাপে টেক্সট ফিল্ড (Safari, Notes, Mail) সহ টেক্সট নির্বাচন করে এবং এক ট্যাপে কাজ সম্পাদন করে। কোড সিনট্যাক্স হাইলাইটিং, Markdown ফরম্যাটিং এবং URL সংক্ষিপ্তকরণ উন্নত ব্যবহারকারীদের জন্য জনপ্রিয় Action Extension উদাহরণ।
ছবির জন্য, Action Extension অফার করে: ফিল্টার প্রয়োগ, ক্রপ, আকার পরিবর্তন, ফরম্যাট রূপান্তর (HEIC থেকে JPEG), ওয়াটারমার্ক যোগ, টেক্সট শনাক্তকরণ (OCR) এবং কম্প্রেশন। ছবি প্রক্রিয়াকরণ দ্রুত হওয়া উচিত — ব্যবহারকারী 2–3 সেকেন্ডের মধ্যে ফলাফল আশা করে। ভারী কাজের জন্য GPU-তে Core Image বা পটভূমি কিউ ব্যবহার করুন।
URL-এর জন্য Action Extension: ওয়েব পৃষ্ঠা থেকে PDF তৈরি, Pocket/Pinterest-এ সংরক্ষণ, সাইটের গতি পরীক্ষা, পৃষ্ঠা আর্কাইভ করা, Open Graph মেটাডেটা প্রাপ্তি, পৃষ্ঠার স্ক্রিনশট জেনারেট করা। PDF জেনারেশন সবচেয়ে চাহিদাপূর্ণ পরিস্থিতিগুলির মধ্যে একটি: ব্যবহারকারী তৃতীয় পক্ষের পরিষেবা না খুলেই ওয়েব পৃষ্ঠাকে PDF-এ রূপান্তর করে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Share Extension হোস্ট অ্যাপ থেকে আপনার অ্যাপে কন্টেন্ট পাঠায়। Action Extension কন্টেন্ট সেখানেই প্রক্রিয়া করে এবং ফলাফল ফেরত দেয়। Share — স্থানান্তর, Action — রূপান্তর। এই মৌলিক পার্থক্য স্থাপত্য এবং UX নির্ধারণ করে।
হ্যাঁ। যদি কাজটি ব্যবহারকারীর ইনপুটের প্রয়োজন না হয় (যেমন, অক্ষর গণনা), এক্সটেনশন এটি পটভূমিতে করতে পারে এবং completeRequest-এর মাধ্যমে তাৎক্ষণিকভাবে ফলাফল ফেরত দিতে পারে। Info.plist-এ আপনাকে NSExtensionActivationSupportsWebURL বা ডেটা ধরনের সাথে মেলে এমন অন্য UTI নির্দিষ্ট করতে হবে।
যে কোনো অ্যাপে যা UIActivityViewController বা মানক অ্যাকশন কন্ট্রোলার সমর্থন করে। এর মধ্যে রয়েছে Safari, ফটো, ফাইল, নোট, মেইল এবং হাজার হাজার তৃতীয় পক্ষের অ্যাপ। Action Extension সেই অ্যাপে কাজ করে না যেগুলি iOS-এর মানক অ্যাকশন প্রক্রিয়া ব্যবহার করে না।
extensionContext.completeRequest(returningItems:)-এর মাধ্যমে NSExtensionItem-এর অ্যারে-সহ। প্রতিটি আউটপুট আইটেমে প্রক্রিয়াকৃত ডেটা-সহ NSItemProvider থাকে। হোস্ট অ্যাপ UIActivityViewController ডেলিগেট বা অনুরূপ কলব্যাকে ফলাফল গ্রহণ করে।
এক্সটেনশন সর্বোচ্চ 30 সেকেন্ড পর্যন্ত চলে, তারপর iOS এটি জোর করে বন্ধ করে দেয়। মূল অ্যাপে সরাসরি অ্যাক্সেস নেই — শুধুমাত্র App Groups-এর মাধ্যমে। Action Extension সমাপ্তির পর পটভূমির কাজ করতে পারে না। দীর্ঘস্থায়ী কাজের জন্য, পরবর্তী লঞ্চে বিজ্ঞপ্তি-সহ পটভূমি NSURLSession ব্যবহার করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন