منابع درخواستی در برنامه iOS

منابع درخواستی در برنامه iOS
منابع درخواستی به شما این امکان را میدهند که دانلود اولیه برنامه کوچکتری را ارسال کنید و داراییهای اضافی مانند تصاویر، صداها، دادههای سطح، مدلهای ML و موارد دیگر را تنها زمانی که کاربر درخواست میکند، بازیابی کنید. این هفته نحوه استفاده از منابع درخواستی برای ذخیره اسرار خارج از باینری برنامه را بررسی خواهیم کرد.
اپل واچ شما هر 4 دقیقه در طول روز ضربان قلب شما را اندازه گیری می کند. با CardioBot، می توانید به راحتی داده های گرفته شده توسط Apple Watch را درک کنید تا بتوانید سبک زندگی خود را بهبود بخشید و الگوهای قابل توجهی را کشف کنید.
اکنون آن را امتحان کنید
iOS بارگیری، ذخیرهسازی و اخراج را انجام میدهد و یک تجربه جریانی یکپارچه را بدون نیاز به منطق دارایی CDN اختصاصی ارائه میکند. اکثر برنامه ها از منابع درخواستی برای حباب های بزرگ مانند داده های سطح در بازی ها یا مدل های ML استفاده می کنند. اما ما همچنین می توانیم از قدرت منابع درخواستی برای حفظ اسرار خارج از باینری خود استفاده کنیم.
به عنوان مثال، میتوانیم توکنهای API را با استفاده از منابع درخواستی بازیابی کنیم و در Keychain ذخیره کنیم. این امر مهندسی معکوس را باینری برنامه ما چالش برانگیزتر می کند.
ابتدا باید آنها را در تنظیمات ساخت هدف برنامه خود فعال کنیم. یک سوئیچ به نام “فعال کردن منابع بر حسب تقاضا” وجود دارد که باید روی YES تنظیم شود. پس از انجام این کار، می توانیم منابع برنامه را با برچسب ها در بخش Resource Tags در تنظیمات هدف برنامه شروع کنیم. این به ما امکان می دهد بعداً با استفاده از این برچسب ها مجموعه خاصی از منابع را بازیابی کنیم.
سه نوع تگ وجود دارد: تگ های نصب اولیه، تگ های پیش واکشی و برچسب های فقط دانلود. تگ های نصب اولیه به همراه باینری برنامه از اپ استور دانلود می شوند. تگ های از پیش دانلود شده به محض دانلود باینری برنامه دانلود می شوند. برچسبهای فقط دانلود فقط زمانی دانلود میشوند که با استفاده از API آنها را درخواست کنید.
final class OnDemandResource {
private let request: NSBundleResourceRequest
init(tags: SetString>) {
request = NSBundleResourceRequest(tags: tags)
}
func pin() async throws -> Bundle {
let isFetched = await request.conditionallyBeginAccessingResources()
if !isFetched {
try await request.beginAccessingResources()
}
return request.bundle
}
func unpin() {
request.endAccessingResources()
}
}
بیایید نوعی ایجاد کنیم که بتوانیم از آن برای دسترسی به منابع خود در صورت تقاضا استفاده کنیم. در اینجا تعریف می کنیم OnDemandResource کلاس با دو عملکرد سنجاق و من دارم دیوونه میشم. را سنجاق درخواست یک منبع با مجموعه تگ ارائه شده را آغاز می کند و بسته ای را برمی گرداند که می توانیم از آن برای دسترسی به منابع خود استفاده کنیم.
استفاده می کنیم مشروط BeginAccessingResources برای بررسی اینکه آیا دسترسی مستقیم به منابع داریم یا خیر. اگر false برگردد، آنها را با استفاده از اپ استور دانلود می کنیم startAccessingResources. اگر دانلود شود، مقدار true را برمیگرداند و تقریباً بلافاصله بسته دسترسی به منبع را دریافت میکنیم. به محض اتمام استفاده از منبع، باید تماس بگیریم من دارم دیوونه میشم به سیستم اجازه می دهد منابع را تخلیه کند.
let resource = OnDemandResource(tags: ["Config"])
let bundle = try await resource.pin()
defer { resource.unpin() }
if let config = bundle.url(forResource: "Config", withExtension: "json") {
// decode your config and save to Keychain
}
منابع درخواستی اغلب با دارایی های بزرگ مرتبط هستند، اما همانطور که دیدیم، آنها همچنین می توانند ابزاری کاربردی برای بهبود وضعیت امنیتی برنامه iOS شما باشند. با انتقال دادههای حساس – مانند توکنهای API – به خارج از باینری برنامه اصلی و ارائه آنها فقط در صورت نیاز، سطح حمله را کاهش میدهید و تجزیه و تحلیل استاتیک را به میزان قابل توجهی دشوارتر میکنید.
منابع در صورت تقاضا می توانند یک تکنیک دفاعی عمیق مفید باشند، اما نباید به خودی خود به عنوان یک مرز امنیتی در نظر گرفته شوند. منابع درخواستی پس از بارگیری در دستگاه به طور پیش فرض رمزگذاری نمی شوند. یک مهاجم مصمم با دسترسی به دستگاه همچنان می تواند منابع ذخیره شده را بازرسی کند.
اپل اشاره کرد که دارایی های درخواستی یک فناوری قدیمی است، بنابراین مهاجرت به دارایی های پس زمینه توصیه می شود. این موضوع هفته آینده خواهد بود. امیدوارم از این یکی لذت برده باشید با خیال راحت مرا دنبال کنید توییتر و هر گونه سوال در رابطه با این پست بپرسید. ممنون که خواندید و هفته آینده شما را می بینیم!

