ส่วนขยายแอป คือโมดูลที่ปฏิบัติการได้แยกต่างหากซึ่งขยายความสามารถของแอปมือถือเกินกว่าอินเทอร์เฟซหลัก: Today Widget บนหน้าจอหลัก การจัดการสาย VoIP ผ่าน CallKit และการตอบสนองต่อเหตุการณ์ระบบผ่าน BroadcastReceiver การรวมระบบช่วยให้แอปโต้ตอบกับระบบปฏิบัติการในระดับลึก ปลดล็อกฟีเจอร์ที่ไม่สามารถใช้ได้กับหน้าจอปกติ ตาม เอกสารสำหรับนักพัฒนา Apple แต่ละส่วนขยายทำงานในกระบวนการที่แยกออกจากกันและถูกจัดการโดยระบบอย่างอิสระจากแอปหลัก ส่วนขยายแอปในแอปมือถือช่วยให้สามารถ implement ฟีเจอร์ที่ไม่สามารถใช้ได้ในกระบวนการหลัก
ประเด็นสำคัญ
ส่วนขยายแอป บน iOS ปรากฏใน iOS 8 และกลายเป็นรากฐานสำหรับการรวมระบบในการพัฒนามือถือ เหล่านี้คือไบนารีแยกต่างหากที่รวมมากับแอปหลักแต่ทำงานในกระบวนการที่แยกออกจากกัน แต่ละส่วนขยายมี Info.plist ของตัวเองและจุดเข้าที่กำหนดผ่าน NSExtensionPrincipalClass ระบบจัดการวงจรชีวิตของส่วนขยายแอป — ไม่สามารถอยู่ในพื้นหลังหลังจากทำงานเสร็จ
WidgetKit (iOS 14+) เป็นเฟรมเวิร์กที่ทันสมัยสำหรับสร้างวิดเจ็ตบนหน้าจอหลัก WidgetKit ใช้ SwiftUI สำหรับอธิบายอินเทอร์เฟซและ TimelineProvider สำหรับกำหนดตารางการอัปเดต วิดเจ็ตมีสามขนาด: เล็ก (2×2 เซลล์), กลาง (4×2) และใหญ่ (4×4) Today Widget แบบเก่าที่ใช้ UICollectionViewController ยังคงได้รับการสนับสนุน แต่ Apple แนะนำให้ย้ายไปยัง WidgetKit ส่วนขยายแอปบน WidgetKit ไม่สนับสนุนแอนิเมชัน การป้อนข้อมูลจากแป้นพิมพ์ หรือท่าทาง — เป็นองค์ประกอบคงที่หรือกึ่งเคลื่อนไหวที่มีการอัปเดตเป็นระยะ
Share Extension อนุญาตให้ส่งเนื้อหาจากแอปใดๆ ไปยังแอปของคุณผ่านแผ่นแชร์ของระบบ Share Extension รับข้อมูลผ่าน NSExtensionItem และใช้ SLComposeServiceViewController สำหรับอินเทอร์เฟซผู้ใช้ Action Extension ประมวลผลเนื้อหาในที่นั้น — ตัวอย่างเช่น แปลข้อความในเบราว์เซอร์โดยไม่ต้องสลับไปยังแอปอื่น ทั้งสองประเภทต้องทำงานให้เสร็จภายในเวลาที่จำกัด มิฉะนั้นระบบจะ "ฆ่า" ส่วนขยาย นี่เป็นข้อจำกัดสำคัญของส่วนขยายแอปในแอปมือถือ — งานพื้นหลังไม่สามารถใช้ได้ในระดับส่วนขยาย
การรวมระบบ บน iOS ไปไกลเกินกว่าวิดเจ็ต: CallKit, PushKit และ SiriKit อนุญาตให้แอปมือถือทำงานในระดับระบบ เฟรมเวิร์กเหล่านี้ต้องการสิทธิ์พิเศษแต่ให้ประสบการณ์ที่ราบรื่นแก่ผู้ใช้ — สายผ่าน CallKit ดูเหมือนสายโทรศัพท์ทั่วไป และ Siri จัดการคำขอโดยไม่ต้องเปิดแอป
CallKit รวมสายของแอปบุคคลที่สามเข้ากับหน้าจอสายของระบบ รวมถึงหน้าจอล็อก CXProvider ลงทะเบียนแอปเป็นบริการ VoIP และ CXCallController จัดการสาย CallKit บล็อกสายซ้ำโดยอัตโนมัติและสนับสนุน Call Directory Extension สำหรับบล็อกหมายเลขที่ไม่ต้องการ การรวมระบบในการพัฒนามือถือกับ CallKit มีความสำคัญสำหรับแอปสื่อสารด้วยเสียง — WhatsApp, Skype และ Zoom ใช้มันเพื่อแสดงสายเรียกเข้า
PushKit ส่งการแจ้งเตือน push ไปยังแอปมือถือโดยตรงโดยไม่แสดงให้ผู้ใช้เห็น PushKit ปลุกแอปจากสถานะ "ถูกฆ่า" และส่งข้อมูลผ่านตัวแทน PKPushRegistryDelegate นี่เป็นกลไกหลักสำหรับแอป VoIP: PushKit ส่งข้อมูลสายและ CallKit แสดงผล PushKit มีลำดับความสำคัญในการส่งสูงกว่าการแจ้งเตือน push ทั่วไปและไม่ต้องการแสดงแบนเนอร์ ส่วนขยายแอปในแอปมือถือมักรวม PushKit กับ CallKit สำหรับการสื่อสารด้วยเสียง
SiriKit อนุญาตให้จัดการคำขอผ่าน Siri และแอปทางลัด Intents Extension เป็นส่วนขยายแอปแยกต่างหากที่ลงทะเบียนอินเทนต์ที่สนับสนุนและประมวลผล SiriKit สนับสนุนมากกว่า 20 โดเมน: สาย ข้อความ การชำระเงิน โน้ต การออกกำลังกาย ทางลัดอนุญาตให้ผู้ใช้สร้างระบบอัตโนมัติ — ตัวอย่างเช่น "ส่งข้อความใน WhatsApp ผ่าน Siri" การรวมระบบกับ SiriKit และทางลัดเพิ่มการมีส่วนร่วมเนื่องจากผู้ใช้ดำเนินการโดยไม่ต้องเปิดแอป
BroadcastReceiver คือคอมโพเนนต์ Android ที่ตอบสนองต่อข้อความกระจายเสียงของระบบ แตกต่างจากส่วนขยายแอป iOS, BroadcastReceiver ไม่ต้องการไบนารีแยกต่างหาก — เพียงลงทะเบียนตัวรับใน manifest หรือในโค้ดผ่าน Context.registerReceiver การรวมระบบบน Android มักเริ่มต้นด้วย BroadcastReceiver: จากการเริ่มบริการเมื่อบูตอุปกรณ์ไปจนถึงการตอบสนองต่อการเชื่อมต่อเครือข่าย
IntentFilter ผูก BroadcastReceiver กับเหตุการณ์ระบบที่เฉพาะเจาะจง เหตุการณ์ทั่วไป: BOOT_COMPLETED (บูตอุปกรณ์), CONNECTIVITY_ACTION (การเปลี่ยนแปลงเครือข่าย), BATTERY_LOW (แบตเตอรี่ต่ำ), TIME_SET (การเปลี่ยนแปลงเวลา) ตัวรับลงทะเบียนใน AndroidManifest.xml หรือผ่าน Context.registerReceiver สำหรับการลงทะเบียนแบบไดนามิก การลงทะเบียนแบบไดนามิกดีกว่า — ไม่ต้องการสิทธิ์ใน manifest และทำงานเฉพาะเมื่อแอปทำงานอยู่เท่านั้น ส่วนขยายแอปบน Android ไม่มีอยู่ในฐานะแนวคิด แต่ BroadcastReceiver มีบทบาทคล้ายกัน — มันขยายความสามารถของแอปผ่านการรวมระบบ
NotificationListenerService คือบริการที่รับการแจ้งเตือนทั้งหมดของระบบ NotificationListenerService ต้องการสิทธิ์ BIND_NOTIFICATION_LISTENER_SERVICE และการเข้าถึงผ่านการตั้งค่าการช่วยเหลือ AccessibilityService เป็นเครื่องมือที่ทรงพลังกว่าสำหรับการรวมระบบ: สามารถอ่านเนื้อหาหน้าจอ จำลองการคลิก และทำให้การทำงานอัตโนมัติ บริการทั้งสองต้องการให้ผู้ใช้เปิดใช้งานอย่างชัดเจนในการตั้งค่า ซึ่งเพิ่มความปลอดภัย การรวมระบบในแอปมือถือผ่าน AccessibilityService ใช้สำหรับตัวเติมอัตโนมัติ โปรแกรมอ่านหน้าจอ และเครื่องมือช่วยเหลือ
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
ตัวอย่างลงทะเบียน BroadcastReceiver สำหรับเหตุการณ์ BOOT_COMPLETED WorkManager ใช้สำหรับการทำงานที่เลื่อนออกไปหลังจากบูตอุปกรณ์ — นี่เป็นวิธีการมาตรฐานสำหรับแอป Android
App Widget Provider บน Android คือสิ่งที่เทียบเท่ากับส่วนขยายแอป iOS ในบริบทของวิดเจ็ต: เป็นคอมโพเนนต์ที่แสดงเนื้อหาโต้ตอบบนหน้าจอหลัก แตกต่างจาก WidgetKit, วิดเจ็ต Android สามารถรับอินพุตจากผู้ใช้ — การคลิก การสลับ และท่าทาง App Widget Provider ลงทะเบียนใน manifest ผ่านคำอธิบาย XML ของขนาดและความถี่ในการอัปเดต
RemoteViews อธิบายอินเทอร์เฟซวิดเจ็ตผ่านเค้าโครง XML และสนับสนุนเฉพาะชุด View ที่จำกัด RemoteViews ไม่อนุญาต View ที่กำหนดเอง — เฉพาะคอมโพเนนต์มาตรฐาน: TextView, ImageView, Button, ProgressBar AppWidgetProvider คือคลาสพื้นฐานที่จัดการการอัปเดต การเปิดใช้งาน และการลบวิดเจ็ต เมธอด onUpdate ถูกเรียกผ่านตัวจับเวลาผ่าน updatePeriodMillis หรือผ่าน WorkManager เพื่อการควบคุมที่แม่นยำ การรวมระบบกับวิดเจ็ตบน Android ต้องการความระมัดระวัง — การอัปเดตบ่อยเกินไปทำให้แบตเตอรี่หมด
Glance API คือไลบรารี Jetpack สำหรับสร้างวิดเจ็ตโดยใช้ Kotlin DSL แทน XML Glance API คอมไพล์เป็น RemoteViews และสนับสนุนไวยากรณ์คล้าย Compose: GlanceComposable, Column, Row, Text ไลบรารีแก้ปัญหาของโค้ด XML ที่ซับซ้อนและอนุญาตให้ทดสอบวิดเจ็ตผ่าน JUnit Glance API ยังไม่สนับสนุนฟีเจอร์ RemoteViews ทั้งหมด — สำหรับวิดเจ็ตโต้ตอบที่ซับซ้อน วิธีการแบบคลาสสิกดีกว่า ส่วนขยายแอปในการพัฒนามือถือบน Android กำลังพัฒนาไปสู่ Glance API ทำให้การสร้างและบำรุงรักษาวิดเจ็ตรง่ายขึ้น
Content Provider คือคอมโพเนนต์ Android สำหรับแชร์ข้อมูลที่มีโครงสร้างระหว่างแอปผ่านอินเทอร์เฟซ ContentResolver ที่เป็นหนึ่งเดียว แตกต่างจากส่วนขยายแอป iOS, Content Provider ไม่สร้างกระบวนการแยกต่างหาก — ข้อมูลถูกขอแบบซิงโครนัสในบริบทของแอปที่เรียก Content Provider เป็นรากฐานของการรวมระบบบน Android: รายชื่อ ไฟล์มีเดีย ปฏิทิน และแอปมาตรฐานใช้มันเพื่อเผยแพร่ข้อมูล
FileProvider เป็นคลาสย่อยของ ContentProvider สำหรับการถ่ายโอนไฟล์อย่างปลอดภัยระหว่างแอป FileProvider สร้าง URI content:// ชั่วคราวแทนพาธ file:// โดยตรง ซึ่งถูกห้ามบน Android 7+ การใช้งานต้องระบุ files-path หรือ external-files-path ในการกำหนดค่า XML ส่วนขยายแอปในการพัฒนามือถือบน Android ไม่มีอยู่ในฐานะแนวคิดแยกต่างหาก แต่ FileProvider ทำหน้าที่ของมัน — มันขยายความสามารถในการแชร์ข้อมูลเกินกว่าแอปเดียว
บน iOS บทบาทของการแชร์ไฟล์ดำเนินการโดย File Provider Extension File Provider Extension เผยแพร่ไฟล์ของแอปในแอป Files ผ่าน NSFileProviderManager แตกต่างจาก FileProvider, ส่วนขยาย iOS ต้องการไบนารีแยกต่างหากและทำงานในกระบวนการที่แยกออกจากกัน File Provider Extension สนับสนุน NSFileProviderItem สำหรับอธิบายไฟล์และ NSFileProviderEnumerator สำหรับการนำทางโฟลเดอร์ การรวมระบบในแอปมือถือผ่าน File Provider Extension อนุญาตให้ผู้ใช้จัดการไฟล์แอปจากแอป Files โดยไม่ต้องเปิดมัน
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
ตัวอย่างแสดงการ implement ขั้นต่ำของ File Provider Extension ใน Swift เมธอด item(for:) ส่งคืนออบเจกต์ NSFileProviderItem ตามตัวระบุ — ระบบเรียกใช้เมื่อแสดงไฟล์ในแอป Files
คำถามที่พบบ่อย
ส่วนขยายแอป คือไบนารีแยกต่างหากที่ขยายฟังก์ชันการทำงานของแอปเกินกว่ากระบวนการของมัน: Today Widget, Share Extension, Action Extension, Keyboard Extension และประเภทอื่นๆ ที่ทำงานในสภาพแวดล้อมที่แยกออกจากกัน
CallKit รวม สาย VoIP เข้ากับอินเทอร์เฟซสายของระบบ ด้วยการแสดงบนหน้าจอล็อก PushKit ส่งการแจ้งเตือน push พื้นหลังโดยไม่แสดงให้ผู้ใช้เห็น — มันปลุกแอปเพื่อประมวลผลข้อมูล เช่น ข้อมูลเกี่ยวกับสายเรียกเข้า
BroadcastReceiver คือคอมโพเนนต์ Android ที่ตอบสนองต่อข้อความกระจายเสียงของระบบ: การบูตอุปกรณ์ (BOOT_COMPLETED), การเชื่อมต่อเครือข่าย (CONNECTIVITY_ACTION), การเปลี่ยนโหมดเครื่องบิน และเหตุการณ์ระบบปฏิบัติการอื่นๆ
ใช้ AppWidgetProvider กับ RemoteViews สำหรับสร้างอินเทอร์เฟซวิดเจ็ตหรือ Glance API (Jetpack) สำหรับวิธีการ Kotlin DSL วิดเจ็ตลงทะเบียนใน manifest ผ่านคำอธิบาย XML ที่ระบุขนาดและความถี่ในการอัปเดต
Content Provider คือคอมโพเนนต์ Android สำหรับแชร์ข้อมูลระหว่างแอปผ่าน ContentResolver ใช้สำหรับเข้าถึงรายชื่อ ไฟล์มีเดีย และข้อมูลที่มีโครงสร้างจากแอปอื่นๆ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ