ภาพรวมส่วนขยายแอป
ทำความเข้าใจส่วนขยายสำหรับการแชร์ การทำงาน และประเภทอื่น ๆ
ภาพรวมส่วนขยายแอป เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
ส่วนขยายแอปคืออะไร
ส่วนขยายแอป ช่วยให้แอปของคุณมอบความสามารถภายในแอปอื่นหรือพื้นที่ของระบบได้ เช่น การแชร์เนื้อหา แป้นพิมพ์แบบกำหนดเอง การจัดทำดัชนี Spotlight และอื่น ๆ ส่วนขยายแต่ละรายการเป็นเป้าหมายแยกต่างหากที่มีวงจรการทำงาน แซนด์บ็อกซ์ และจุดเริ่มต้นของตนเองซึ่งระบบกำหนด
// Extensions run in their own process, launched
// by the host (Photos, Safari, Messages, the system),
// not by your main app.แอปโฮสต์ คอนเทนเนอร์ และแซนด์บ็อกซ์
มีองค์ประกอบสามส่วน ได้แก่ แอปโฮสต์ เป็นผู้เรียกใช้ส่วนขยาย แอปคอนเทนเนอร์ ของคุณเป็นผู้จัดส่งส่วนขยาย และส่วนขยายทำงานอยู่ภายในแซนด์บ็อกซ์ ส่วนขยายไม่สามารถสื่อสารกับแอปของคุณได้อย่างอิสระ ทั้งสองจะสื่อสารผ่านกลุ่มแอป ไม่ใช่การเข้าถึงหน่วยความจำโดยตรง
import Foundation
// Container app + Extension target share data via
// an App Group, e.g. group.com.example.app
let group = "group.com.example.app"
_ = groupส่วนขยายการแชร์
ส่วนขยายการแชร์ จะปรากฏในแผ่นแชร์ของระบบ ช่วยให้ผู้ใช้ส่งเนื้อหา เช่น ข้อความ URL หรือรูปภาพ จากแอปใด ๆ เข้าแอปของคุณ ส่วนขยายนี้สืบทอดหรือโฮสต์ตัวควบคุมมุมมอง และอ่านรายการที่แชร์จากบริบทของส่วนขยาย
import Foundation
// Share extension reads incoming items:
// extensionContext?.inputItems
// each NSExtensionItem has attachments (NSItemProvider)
let share = "appears in the share sheet"
_ = shareการอ่านรายการที่แชร์
เนื้อหาที่แชร์จะมาถึงในรูปแบบไฟล์แนบของ NSItemProvider คุณตรวจสอบตัวระบุชนิดแล้วโหลดค่าดังกล่าวแบบอะซิงโครนัส นี่คือวิธีที่ส่วนขยายการแชร์ดึง URL หรือรูปภาพที่ผู้ใช้กำลังแชร์
import UniformTypeIdentifiers
func handle(_ provider: NSItemProvider) {
if provider.hasItemConformingToTypeIdentifier(
UTType.url.identifier) {
provider.loadItem(
forTypeIdentifier: UTType.url.identifier) {
value, _ in
print("shared url:", value ?? "none")
}
}
}ส่วนขยายการดำเนินการ
ส่วนขยายการดำเนินการ จะเปลี่ยนแปลงหรือแสดงเนื้อหาในตำแหน่งเดิม เช่น แปลข้อความที่เลือกหรือใส่คำอธิบายประกอบใน PDF และสามารถส่งผลลัพธ์กลับไปยังโฮสต์ได้ ต่างจากส่วนขยายการแชร์ ส่วนขยายนี้มีไว้เพื่อจัดการกับเนื้อหา ไม่ใช่ส่งเนื้อหาไปที่อื่น
import Foundation
// Action extension may return modified items:
// extensionContext?.completeRequest(
// returningItems: outputItems)
let action = "acts on content, can return a result"
_ = actionส่วนขยายบริการการแจ้งเตือน
ส่วนขยายบริการการแจ้งเตือน จะดักรับการแจ้งเตือนแบบพุชที่เข้ามาพร้อม mutable-content: 1 เพื่อแก้ไขก่อนแสดงผล เช่น ถอดรหัสเนื้อหา ดาวน์โหลดไฟล์แนบสื่อ หรือเขียนชื่อเรื่องใหม่ โดยต้องทำงานให้เสร็จภายในเวลาที่จำกัด
import UserNotifications
// Override in UNNotificationServiceExtension:
// didReceive(_ request:, withContentHandler:)
// mutate bestAttemptContent, then call the handler
let service = "modifies push before it shows"
_ = serviceส่วนขยายเนื้อหาการแจ้งเตือน
ส่วนขยายเนื้อหาการแจ้งเตือน จัดเตรียมส่วนติดต่อผู้ใช้แบบกำหนดเองสำหรับการแจ้งเตือนที่ขยายออก เช่น แผนที่ เครื่องเล่นสื่อ หรือส่วนควบคุมแบบโต้ตอบ ซึ่งจะแสดงเมื่อผู้ใช้กดแบนเนอร์ค้างไว้ ส่วนขยายนี้เชื่อมโยงกับหมวดหมู่การแจ้งเตือน
import UserNotifications
// UNNotificationContentExtension renders a custom view
// for a given UNNotificationCategory when expanded.
let content = "custom expanded notification UI"
_ = contentวงจรการทำงานของ completeRequest
ส่วนขยายมีอายุการทำงานสั้น เมื่อทำงานเสร็จแล้ว ให้เรียก extensionContext?.completeRequest(returningItems:completionHandler:) เพื่อส่งสัญญาณว่าเสร็จสิ้นและอนุญาตให้โฮสต์ปิดส่วนขยาย หากต้องการยุติการทำงาน ให้ใช้ cancelRequest(withError:) การปล่อยให้กระบวนการทำงานค้างไว้จะสิ้นเปลืองทรัพยากรและอาจถูกระบบยุติได้
import Foundation
func finish(context: NSExtensionContext?) {
context?.completeRequest(
returningItems: [], completionHandler: nil)
}จุดขยายอื่น ๆ
iOS มีจุดขยายมากมาย เช่น แป้นพิมพ์แบบกำหนดเอง ผู้ให้บริการเอกสาร การจัดทำดัชนี Spotlight ตัวบล็อกเนื้อหา Safari อินเทนต์ของ Siri การแก้ไขรูปภาพ และส่วนขยายผู้ให้บริการไฟล์ แต่ละรายการสอดคล้องกับโพรโทคอลที่ระบบกำหนด ซึ่งประกาศโดย NSExtensionPointIdentifier ใน Info.plist
// Info.plist of an extension declares its point:
// NSExtension > NSExtensionPointIdentifier
// e.g. com.apple.share-services
// com.apple.usernotifications.service
let point = "each extension declares its point"
_ = pointขีดจำกัดหน่วยความจำและเวลา
ส่วนขยายทำงานภายใต้ข้อจำกัดที่เข้มงวดกว่าแอปหลัก ทั้งใช้หน่วยความจำได้น้อยกว่าและมีงบเวลาตามนาฬิกาจริงที่สั้นกว่า ให้ทำงานเท่าที่จำเป็น หลีกเลี่ยงการจัดสรรหน่วยความจำขนาดใหญ่ และส่งต่อการประมวลผลที่ใช้ทรัพยากรมากไปยังแอปหลักผ่านพื้นที่จัดเก็บที่แชร์เมื่อทำได้
import Foundation
// Tight memory + short runtime.
// Pattern: extension stages data in the App Group,
// the main app processes it fully on next launch.
let limits = "keep extensions lean and fast"
_ = limitsการแชร์โค้ดระหว่างเป้าหมาย
เพื่อหลีกเลี่ยงการทำซ้ำตรรกะ ให้นำโมเดลและตัวช่วยที่ใช้ร่วมกันไปไว้ในเฟรมเวิร์กหรือแพ็กเกจ Swift ที่ทั้งแอปและส่วนขยายใช้งานร่วมกัน ทำเครื่องหมายเฉพาะสิ่งที่แต่ละเป้าหมายต้องใช้ ส่วนขยายจะลิงก์โค้ดชุดเดียวกันโดยไม่ต้องคัดลอก
import Foundation
// Shared Swift package 'AppCore' linked by:
// - main app target
// - share extension target
// - widget extension target
let shared = "one source of truth for models"
_ = sharedตรวจสอบอย่างรวดเร็ว
ทบทวนว่าส่วนขยายสื่อสารกับแอปคอนเทนเนอร์อย่างไร
สรุปทบทวน
คุณได้สำรวจส่วนขยายแอปแล้ว:
- ส่วนขยายเป็นเป้าหมายแยกต่างหากที่ทำงานในแซนด์บ็อกซ์และเปิดใช้โดยโฮสต์ ประเภทต่าง ๆ ได้แก่ การแชร์ การดำเนินการ บริการการแจ้งเตือน และเนื้อหาการแจ้งเตือน
- อ่านเนื้อหาที่เข้ามาผ่าน
NSItemProviderและจบการทำงานด้วยcompleteRequest - ส่วนขยายแต่ละรายการประกาศ
NSExtensionPointIdentifierและทำงานภายใต้ขีดจำกัดหน่วยความจำและเวลาที่เข้มงวด - แชร์ข้อมูลผ่านกลุ่มแอปและนำโค้ดกลับมาใช้ใหม่ผ่านแพ็กเกจที่แชร์ร่วมกัน
คำถามที่พบบ่อย
บทเรียน “ภาพรวมส่วนขยายแอป” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ภาพรวมส่วนขยายแอป” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ภาพรวมส่วนขยายแอป”
ทำความเข้าใจส่วนขยายสำหรับการแชร์ การทำงาน และประเภทอื่น ๆ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ภาพรวมส่วนขยายแอป” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ