File Provider Extension เป็นกลไก iOS ที่ช่วยให้แอปพลิเคชันสามารถให้การเข้าถึงไฟล์จากแหล่งที่มาจากภายนอกผ่านแอปไฟล์ที่ติดตั้งมากับระบบ ตาม Apple Developer Documentation, 2024, File Provider Extension ทำให้สามารถแสดงไฟล์จากพื้นที่เก็บข้อมูลแบบคลาว์ด, เซิร์ฟเวอร์ และระบบไฟล์ที่กำหนดเองได้โดยตรงใน Files.app — โดยไม่ต้องนำเข้าต่างๆ ในเครื่องส่วนบุคคลก่อน ผู้ใช้ได้รับอินเทอร์เฟสแบบเดียวสำหรับการทำงานกับไฟล์โดยไม่คำนึงถึงตำแหน่งทางกายภาพของมัน
ข้อมูลสำคัญ
File Provider Extension เป็นส่วนขยายแอปพลิเคชันใน iOS และ macOS ที่ช่วยให้แอปพลิเคชันสามารถให้การเข้าถึงไฟล์จากแหล่งที่มาจากภายนอกผ่านแอปไฟล์ของระบบ มันถูกเปิดตั้งใน iOS 11 และแทนที่กลไก Document Provider โดยเพิ่มการรองรับการซังโครไนซ์, การค้นหา และแท็ก
งานหลักของ File Provider Extension คือการทำหน้าที่เป็นสะพานระหว่างพื้นที่เก็บข้อมูลภายนอก (เซิร์ฟเวอร์คลาว์ด, NAS ขององค์กร, FTP) กับ Files.app ผู้ใช้เห็นไฟล์และโฟลเดอร์เสมือนว่ามันถูกเก็บไว้ในเครื่องส่วนบุคคล แม้ว่าข้อมูลจริงอาจอยู่บนเซิร์ฟเวอร์ระยะไกล ส่วนขยายทำงานในเบื้องหลัง, ซังโครไนซ์เนื้อหาตามความต้องการ
ตามข้อมูลจาก WWDC 2024, Apple กำลังพัฒนา FileProvider API อย่างกระออกรรม: เพิ่มการรองรับการซังโครไนซ์แบบเพิ่มเติม, ประสิทธิภาพสำหรับไดเร็กทอรีขนาดใหญ่ดีขึ้น และขณะเดียวกันการดำเนินการแบบชุดก็พร้อมใช้งานได้ ทำให้ File Provider Extension เป็นวิธีที่ต้องการในการผนวกไฟล์ภายนอกเข้ากับระบบนิเวศของ Apple
โครงสร้าง ของ File Provider Extension ประกอบด้วยสองส่วนประกอบ: ส่วนขยายหลัก (ชนิดผู้ให้บริการไฟล์) และส่วนขยาย UI ที่เลือกได้สำหรับการตรวจสอบสิทธิ์และการกำหนดค่า ส่วนขยายหลักใช้โปรโตคอล NSFileProviderExtension และจัดการคำขอทั้งหมดจาก Files.app
import FileProvider
class CloudFileProvider: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
guard let item = storage
.item(for: identifier) else {
throw NSError(domain: NSFileProviderErrorDomain,
code: NSFileProviderError.noSuchItem.rawValue)
}
return item
}
override func urlForItem(with identifier: NSFileProviderItemIdentifier) -> URL {
return fileCoordinator.urlForItem(with: identifier)
}
}
เมื่อผู้ใช้เปิด Files.app และเลือกผู้ให้บริการของคุณ, ระบบจะเริ่มส่วนขยายในโปรเซสพื้นหลัง ส่วนขยายไม่มี UI — มันเป็นโปรเซสที่ไม่มีส่วนหัวที่จัดการคำขออ่าน, เขียน, เปลี่ยนชื่อ และลบไฟล์ การดำเนินการทั้งหมดจะดำเนินแบบไม่ต้องรอคำตอบผ่าน NSFileProviderManager
ข้อแตกต่างที่สำคัญ: File Provider Extension อยู่ในโปรเซสแยกต่างหาก และระบบสามารถเวิร์กได้เมื่อหน่วยความจำต่ำ ดังนั้น ผู้ให้บริการต้องสามารถกู้คืนสถานะหลังการเริ่มใหม่โดยการบันทึกตัวระบุและแคร์ชการซังโครไนซ์ไว้ในหน่วยความจำถาวร
NSFileProviderItem เป็นโปรโตคอลที่อธิบายไฟล์หรือโฟลเดอร์แต่ละรายการในลำดับชั้นของผู้ให้บริการ แต่ละรายการมีตัวระบุเฉพาะเจาะจง, ชื่อ, ประเภท (ไฟล์หรือโฟลเดอร์), วันที่สร้างและแก้ไข, ขนาด และแฟลง (พร้อมใช้งานได้แบบออฟไลน์, อ่านอย่างเดียว)
| คุณสมบัติ | ประเภท | คำอธิบาย |
|---|---|---|
| itemIdentifier | NSFileProviderItemIdentifier | ID เฉพาะของรายการในระบบผู้ให้บริการ |
| parentItemIdentifier | NSFileProviderItemIdentifier | ID ของโฟลเดอร์หลัก (ราก — .rootContainer) |
| filename | String | ชื่อไฟล์พร้อมนามต่อท้าย |
| typeIdentifier | String (UTType) | ตัวระบุประเภทแบบเดี่ยวสำหรับการกำหนดประเภทของเนื้อหา |
| capabilities | NSFileProviderItemCapabilities | แฟลง: การลบ, การเปลี่ยนชื่อ, การเพิ่มแท็ก |
โปรโตคอลยังรองรับความสามารถที่ขยายผ่าน NSFileProviderItemProtocol: แท็ก (ฉลากสี), ไอคอน, การเวอร์ชั่น และการกระทำที่กำหนดเอง สำหรับไฟล์ขนาดใหญ่, การรองรับการโอนเบ็อร์ที่สามารถเริ่มต่อได้นั้นถูกนำไปใช้ผ่าน NSFileProviderService
ตามข้อมูลจาก WWDC 2023, Apple แนะนำให้ใช้ closure (NSFileProviderItemFields) เพื่ออัพเดทเฉพาะคุณสมบัติที่เปลี่ยนแปลง แทนที่จะอัพเดททั้งอปเจกต์ ซึ่งช่วยเร่งการซังโครไนซ์ได้อย่างมากในระหว่างการอัพเดทแบบชุด — ตัวอย่างเช่น เมื่อมีเฉพาะขนาดของกลุ่มไฟล์ที่เปลี่ยนแปลง
NSFileProviderManager เป็นคลาสส่วนกลางสำหรับจัดการวงจรของส่วนขยาย โดยให้เมธอดในการแจ้งสัญญาณระบบเกี่ยวกับการเปลี่ยนแปลง, จัดการข้อขัดแยงแบบร่วมมือกัน และจัดการดาวน์โหลด ตัวจัดการจะติดตามการส่งต่อที่กำลังทำงานโดยอัตโนมัติ และให้ความสำคัญแก่ไฟล์ที่ผู้ใช้มองเห็น
class SyncManager {
let providerManager = NSFileProviderManager.default
func signalUpdate(for item: NSFileProviderItemIdentifier) {
providerManager.signalEnumerator(
for: item.parentItemIdentifier
) { error in
if let error = error {
Logger.sync.error(
"Failed to signal: \(error.localizedDescription)"
)
}
}
}
func uploadItem(at url: URL, itemId: NSFileProviderItemIdentifier) {
providerManager.registerURLBasedItem(
with: itemId,
url: url
)
}
}
เครื่องจักรซังโครไนซ์ คือตรรกะที่นักพัฒนานำไปใช้อย่างอิสระ Apple ไม่มีกลไกการซังโครไนซ์ในตัว — มีแต่ API สำหรับแจ้งระบบเกี่ยวกับการเปลี่ยนแปลงเท่านั้น ผู้ให้บริการเป็นผู้ตัดสินใจว่าจะดาวน์โหลดไฟล์จากเซิร์ฟเวอร์อย่างไร, จะไหลแคร์ชไว้ในเครื่องส่วนบุคคลอย่างไร และจะแก้ไขข้อขัดแยงการแก้ไขอย่างไร
ข้อขัดแยง: ระบบรองรับการตรวจจับข้อขัดแยงเวอร์ชั่นผ่าน NSFileProviderSyncAnchor เมื่อไฟล์ถูกเปลี่ยนแปลงพร้อมกันทั้งในเครื่องและระยะไกล, ผู้ให้บริการจะใช้สมอเรือการซังโครไนซ์เพื่อระบุเวอร์ชั่นล่าสุดที่ได้รับการซังโครไนซ์ และแก้ไขข้อขัดแยงโดยใช้กลยุทธ์ ผู้เขียนคนสุดท้ายเป็นผู้ชนะ หรือสร้างสำเนาที่ขัดแยงกัน
File Provider Extension ทำงานภายในกล่องทราย iOS ที่เข้มงวด ส่วนขยายไม่สามารถเข้าถึงระบบไฟล์ของแอปเจ้าภาพได้โดยตรง และในทางกลับกัน, แอปไม่สามารถอ่านไฟล์ของผู้ให้บริการได้โดยตรง การแลกเปลี่ยนข้อมูลทั้งหมดจะผ่าน API ระบบของ Files.app
การเข้าถึงไฟล์ของผู้ใช้เป็นไปได้โดยการใต้ตอบแบบแจ้งชัดเท่านั้น: ผู้ใช้เปิดไฟล์จาก Files.app ในแอปพลิเคชัน และระบบจะสร้างสำเนาชั่วคราวของไฟล์ในคอนเทนเนอร์ที่แยกออก แอปพลิเคชันที่ได้รับจะทำงานกับสำเนานี้, ไม่ใช่ต้นฉบับในพื้นที่เก็บข้อมูลของผู้ให้บริการ
ตาม Apple Security Guide, 2024, ผู้ให้บริการต้องใช้การเข้ารหัสข้อมูลในระหว่างการส่ง (TLS 1.3) และสามารถเลือกเพิ่มการเข้ารหัสดิส์ก์สำหรับไฟล์ที่ถูกแคร์ช การตรวจสอบสิทธิ์ผู้ใช้จะดำเนินการโดยส่วนประกอบ FileProviderUI แยกต่างหาก, ซึ่งทำงานนอกกล่องทรายของส่วนขยายเพื่อการป้อนข้อมูลรับรองอย่างปลอดภัย
ข้อจำกัดหลัก: ส่วนขยายไม่สามารถรันโค้ดโดยพเสนจ — มันประมวลผลเฉพาะคำขอผ่าน NSFileProviderManager เท่านั้น ตรรกะทำใดๆ ที่เกินกว่าการดำเนินการไฟล์จะต้องถูกนำไปใช้ในแอปหลัก และเรียกผ่านกลุ่มแอปหรือบริการ XPC
คำถามที่พบบ่อย
File Provider Extension เป็นส่วนขยายแอปพลิเคชันสำหรับการผนวกพื้นที่เก็บข้อมูลไฟล์ภายนอกกับแอปไฟล์ โดยสามารถแสดงไฟล์จากบริการคลาว์ด, FTP, NAS และแหล่งที่มาจากภายนอกอื่นๆ โดยไม่ต้องคัดลอกไฟล์เหล่านั้นในเครื่องส่วนบุคคล
File Provider (iOS 11+) แทนที่ Document Provider โดยเพิ่มการซังโครไนซ์พื้นหลัง, การรองรับการค้นหาผ่าน Spotlight, แท็ก และประสิทธิภาพที่ดีขึ้น Document Provider ถูกทำให้เพิ่งไฟล์ใน iOS 11 และถูกลบออกใน iOS 14
การซังโครไนซ์ ถูกนำไปใช้โดยนักพัฒนาผ่าน NSFileProviderManager ส่วนขยายจะแจ้งสัญญาณระบบเกี่ยวกับการเปลี่ยนแปลงผ่าน signalEnumerator และระบบจะขอรายการที่อัพเดทแล้ว ข้อขัดแยงเวอร์ชั่นจะถูกแก้ไขผ่าน NSFileProviderSyncAnchor
ได้, File Provider Extension สามารถทำงานเป็นโปรเซสอิสระโดยไม่ต้องใช้แอปหลักทำงาน มันเป็นส่วนขยายแบบไม่มีส่วนหัวที่ iOS เริ่มต้นเมื่อร้องขอจาก Files.app อย่างไรก็ตาม, การตรวจสอบสิทธิ์และการตั้งค่าเริ่มต้นมักจะดำเนินการผ่านแอปหลัก
ส่วนขยายต้องการ ความสามารถ File Provider ใน Xcode พร้อมทั้งสิทธิ์ในการใช้งาน com.apple.developer.file-provider สำหรับการเข้าถึงเครือข่าย, จะเพิ่มความสามารถ Network สิทธิ์อื่นๆ ทั้งหมดถูกจำกัดอย่างเข้มงวดโดยกล่องทราย iOS
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม