File Provider Extension مکانیزمی در iOS است که به برنامهها اجازه میدهد از طریق برنامه داخلی Files به فایلهای منابع خارجی دسترسی ارائه دهند. بر اساس Apple Developer Documentation, 2024، File Provider Extension امکان نمایش فایلها از ذخیرهسازهای ابری، سرورها و سیستمهای فایل سفارشی را مستقیماً در Files.app فراهم میکند — بدون نیاز به وارد کردن محلی آنها. کاربر یک رابط واحد برای کار با فایلها بدون توجه به مکان فیزیکی آنها دریافت میکند.
نکات اصلی
File Provider Extension یک توسعه برنامه در iOS و macOS است که به برنامه اجازه میدهد از طریق برنامه سیستم Files به فایلهای منابع خارجی دسترسی ارائه دهد. این ویژگی در iOS 11 ظاهر شد و مکانیزم Document Provider را جایگزین کرد و پشتیبانی از همگامسازی، جستجو و برچسبها را اضافه نمود.
وظیفه اصلی File Provider Extension ایفای نقش پل بین ذخیرهساز خارجی (سرور ابری، NAS سازمانی، FTP) و Files.app است. کاربر فایلها و پوشهها را طوری میبیند که گویی به صورت محلی ذخیره شدهاند، در حالی که دادهها ممکن است روی یک سرور راه دور باشند. توسعه در پسزمینه کار میکند و محتوا را در صورت نیاز همگامسازی میکند.
بر اساس WWDC 2024، اپل به طور فعال FileProvider API را توسعه میدهد: پشتیبانی از همگامسازی افزایشی، بهبود عملکرد برای دایرکتوریهای بزرگ و امکان عملیات گروهی اضافه شده است. این باعث میشود File Provider Extension روش ترجیحی برای ادغام فایلهای خارجی در اکوسیستم اپل باشد.
معماری 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 را باز میکند و ارائهدهنده شما را انتخاب میکند، سیستم توسعه را در یک فرآیند پسزمینه راهاندازی میکند. توسعه رابط کاربری ندارد — این یک فرآیند headless است که درخواستهای خواندن، نوشتن، تغییر نام و حذف فایلها را پردازش میکند. تمام عملیات به صورت ناهمزمان از طریق NSFileProviderManager انجام میشود.
نکته مهم: File Provider Extension در یک فرآیند جداگانه زندگی میکند و ممکن است در صورت کمبود حافظه توسط سیستم خاتمه یابد. بنابراین ارائهدهنده باید بتواند وضعیت را پس از راهاندازی مجدد بازیابی کند، شناسهها و حافظه نهان همگامسازی را در حافظه دائمی ذخیره نماید.
NSFileProviderItem پروتکلی است که یک فایل یا پوشه جداگانه را در سلسله مراتب ارائهدهنده توصیف میکند. هر عنصر دارای شناسه منحصر به فرد، نام، نوع (فایل یا پوشه)، تاریخ ایجاد و تغییر، اندازه و پرچمها (در دسترس آفلاین، فقط خواندنی) است.
| ویژگی | نوع | توضیحات |
|---|---|---|
| itemIdentifier | NSFileProviderItemIdentifier | شناسه یکتای عنصر در سیستم ارائهدهنده |
| parentItemIdentifier | NSFileProviderItemIdentifier | شناسه پوشه والد (ریشه — .rootContainer) |
| filename | String | نام فایل با پسوند |
| typeIdentifier | String (UTType) | شناسه نوع یکسان برای تعیین نوع محتوا |
| capabilities | NSFileProviderItemCapabilities | پرچمها: حذف، تغییر نام، افزودن برچسب |
این پروتکل همچنین از قابلیتهای پیشرفته از طریق NSFileProviderItemProtocol پشتیبانی میکند: برچسبها (برچسبهای رنگی)، آیکونها، نسخهبندی و اقدامات سفارشی. برای فایلهای بزرگ، پشتیبانی از انتقالهای قابل ادامه (resumable transfers) از طریق NSFileProviderService پیادهسازی میشود.
بر اساس WWDC 2023، اپل توصیه میکند از بستهها (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
)
}
}
موتور همگامسازی — منطقی است که توسعهدهنده خودش پیادهسازی میکند. اپل مکانیزم همگامسازی داخلی ارائه نمیدهد — فقط API برای اطلاعرسانی به سیستم درباره تغییرات. ارائهدهنده خودش تصمیم میگیرد که چگونه فایلها را از سرور دانلود کند، آنها را به صورت محلی ذخیره نماید و تعارضات ویرایش را حل کند.
تعارضات: سیستم تشخیص تعارضات نسخه را از طریق NSFileProviderSyncAnchor پشتیبانی میکند. وقتی فایل به طور همزمان به صورت محلی و از راه دور تغییر میکند، ارائهدهنده از لنگر همگامسازی برای تعیین آخرین نسخه همگامسازی شده و حل تعارض با استراتژی «آخرین نویسنده برنده میشود» یا با ایجاد یک کپی تعارض استفاده میکند.
File Provider Extension در داخل یک sandbox (محیط ایزوله) سختگیرانه iOS کار میکند. توسعه به سیستم فایل برنامه میزبان دسترسی مستقیم ندارد و برعکس — برنامه نمیتواند فایلهای ارائهدهنده را مستقیماً بخواند. تمام تبادل داده از طریق APIهای سیستمی Files.app انجام میشود.
دسترسی به فایلهای کاربر فقط از طریق تعامل صریح امکانپذیر است: کاربر فایل را از Files.app در یک برنامه باز میکند و سیستم یک کپی موقت از فایل در یک کانتینر ایزوله ایجاد میکند. برنامه دریافتکننده با این کپی کار میکند، نه با نسخه اصلی در ذخیرهساز ارائهدهنده.
بر اساس Apple Security Guide, 2024، ارائهدهنده موظف است رمزنگاری دادهها را در هنگام انتقال (TLS 1.3) پیادهسازی کند و میتواند به صورت اختیاری رمزنگاری روی دیسک برای فایلهای ذخیره شده اضافه نماید. احراز هویت کاربر از طریق یک مؤلفه UI جداگانه FileProviderUI انجام میشود که برای ورود امن اطلاعات کاربری خارج از sandbox توسعه راهاندازی میشود.
محدودیت کلیدی: توسعه نمیتواند کد دلخواه اجرا کند — فقط درخواستها را از طریق NSFileProviderManager پردازش میکند. هر منطقی که فراتر از عملیات فایل باشد باید در برنامه اصلی پیادهسازی و از طریق app groups یا XPC services فراخوانی شود.
سوالات متداول
File Provider Extension یک توسعه برنامه برای ادغام ذخیرهسازهای فایل خارجی با برنامه Files است. این امکان نمایش فایلها از سرویسهای ابری، FTP، NAS و سایر منابع را بدون کپی کردن محلی آنها فراهم میکند.
File Provider (iOS 11+) جایگزین Document Provider شد و همگامسازی پسزمینه، پشتیبانی از جستجو از طریق Spotlight، برچسبها و عملکرد بهبود یافته را اضافه کرد. Document Provider از iOS 11 منسوخ شده و در iOS 14 حذف شد.
همگامسازی توسط توسعهدهنده از طریق NSFileProviderManager پیادهسازی میشود. توسعه از طریق signalEnumerator به سیستم درباره تغییرات اطلاع میدهد و سیستم لیست بهروز شده عناصر را درخواست میکند. تعارضات نسخه از طریق NSFileProviderSyncAnchor حل میشوند.
بله، File Provider Extension میتواند به عنوان یک فرآیند مستقل بدون اجرای برنامه اصلی کار کند. این یک توسعه headless است که iOS آن را به درخواست Files.app راهاندازی میکند. با این حال، احراز هویت و پیکربندی اولیه معمولاً از طریق برنامه اصلی انجام میشود.
توسعه به capability File Provider در Xcode و همچنین entitlement com.apple.developer.file-provider نیاز دارد. برای دسترسی به شبکه، capability Network اضافه میشود. سایر مجوزها به شدت توسط sandbox iOS محدود میشوند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید