0Pricing
Swift Academy · บทเรียน

ภาพรวมส่วนขยายแอป

ทำความเข้าใจส่วนขยายสำหรับการแชร์ การทำงาน และประเภทอื่น ๆ

ภาพรวมส่วนขยายแอป เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้างวิดเจ็ตด้วย WidgetKit
  2. ผู้ให้บริการไทม์ไลน์และสแนปชอต
  3. ภาพรวมส่วนขยายแอป
  4. App Intents และทางลัด
← กลับไปที่ Swift Academy