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 ประกอบด้วย target ใน Xcode, UIViewController สำหรับแสดงอินเทอร์เฟซ (ไม่บังคับ), NSExtensionContext สำหรับการเข้า/ออกข้อมูล และการกำหนดค่า Info.plist สถาปัตยกรรม ง่ายกว่า Share Extension: ไม่มีอินเทอร์เฟซการเขียนที่จำเป็น และส่วนขยายสามารถทำงานได้อย่างสมบูรณ์โดยไม่มี UI
Target — bundle แยกต่างหากพร้อมตัวระบุที่สืบทอดมาจากแอปหลัก UIViewController — อินเทอร์เฟซที่ไม่บังคับสำหรับแสดงความคืบหน้า การตั้งค่า หรือผลลัพธ์ NSExtensionContext — คอนเทนเนอร์ที่มีข้อมูลเข้า (inputItems) และเมธอด completeRequest สำหรับส่งคืนผลลัพธ์ Info.plist — การกำหนดค่าการเปิดใช้งานผ่าน NSExtensionActivationRule และแอตทริบิวต์ (NSExtensionAttributes) สำหรับระบุประเภทเนื้อหาที่รองรับ
Action Extension รับข้อมูลเข้าผ่าน extensionContext?.inputItems — อาร์เรย์ของ NSExtensionItem แต่ละรายการมีไฟล์แนบพร้อมข้อมูลและ UTI หลังจากการประมวลผล ส่วนขยายเรียก completeRequest(returningItems:) พร้อมอาร์เรย์ของ NSExtensionItem เอาต์พุต แอปโฮสต์รับข้อมูลที่ประมวลผลแล้วและแสดงผล โมเดลอะซิงโครนัส: ส่วนขยายสามารถดำเนินการที่ใช้เวลานาน โดยคงบริบทไว้สูงสุด 30 วินาที
มาดูการสร้าง Action Extension ใน Swift สำหรับการแปลข้อความที่เลือกกัน ส่วนขยายรับข้อความจากแอปโฮสต์ ส่งไปยังเซิร์ฟเวอร์แปลภาษา และส่งคืนผลลัพธ์ 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 อาจถูกเรียกบนเธรดพื้นหลัง — อัปเดต UI ผ่าน DispatchQueue.main เท่านั้น
Action Extension ส่งคืนข้อมูลที่ประมวลผลแล้วผ่าน completeRequest พร้อมอาร์เรย์ของ NSExtensionItem แต่ละรายการสอดคล้องกับประเภทข้อมูลเอาต์พุต แอปโฮสต์สามารถแทนที่เนื้อหาต้นฉบับด้วยเนื้อหาที่ประมวลผลแล้ว — ตัวอย่างเช่น แทนที่รูปภาพต้นฉบับด้วยรูปภาพที่ผ่านการกรอง NSExtensionItem รองรับ UTI เดียวกับอินพุต รวมถึง UTI เพิ่มเติม (เช่น public.html สำหรับเนื้อหาเว็บ)
Action Extension ใช้ในหลายสิบสถานการณ์ — ตั้งแต่เครื่องมืออรรถประโยชน์ธรรมดาไปจนถึงเวิร์กโฟลว์ทางธุรกิจที่ซับซ้อน ตัวอย่างคลาสสิก ครอบคลุมการดำเนินการข้อความ กราฟิก และไฟล์ รวมถึงการผสานรวมเนื้อหาเว็บ
Action Extension สำหรับข้อความ: การแปล การตรวจสอบการสะกด การนับอักขระ การเปลี่ยนตัวพิมพ์ การเข้ารหัส การสร้างรหัส QR จากข้อความ ผู้ใช้เลือกข้อความในแอปใด ๆ ที่มีฟิลด์ข้อความ (Safari, Notes, Mail) และดำเนินการด้วยการแตะเพียงครั้งเดียว การเน้นไวยากรณ์ ของโค้ด การจัดรูปแบบ Markdown และการย่อ URL เป็นตัวอย่าง Action Extension ยอดนิยมสำหรับผู้ใช้ขั้นสูง
สำหรับรูปภาพ Action Extension มีให้: การใช้ฟิลเตอร์ การครอบตัด การปรับขนาด การแปลงรูปแบบ (HEIC เป็น JPEG) การเพิ่มลายน้ำ การรู้จำข้อความ (OCR) และการบีบอัด การประมวลผลรูปภาพ ควรรวดเร็ว — ผู้ใช้คาดหวังผลลัพธ์ภายใน 2–3 วินาที สำหรับการดำเนินการหนัก ให้ใช้ Core Image บน GPU หรือคิวพื้นหลัง
Action Extension สำหรับ URL: การสร้าง 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 หรือ callback ที่คล้ายกัน
ส่วนขยายทำงานสูงสุด 30 วินาที หลังจากนั้น iOS จะบังคับยุติ ไม่มีการเข้าถึงแอปหลักโดยตรง — ผ่าน App Groups เท่านั้น Action Extension ไม่สามารถทำงานพื้นหลังหลังจากเสร็จสิ้น สำหรับการดำเนินการที่ใช้เวลานาน ให้ใช้ NSURLSession พื้นหลังพร้อมการแจ้งเตือนเมื่อเปิดใช้งานครั้งถัดไป
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม