On-Demand Resources, Apple'ın uygulama içeriğini gecikmeli yükleme teknolojisidir. Tüm kaynakları kurulum paketine dahil etmek yerine, geliştiriciler bunları App Store sunucularında barındırır ve ihtiyaç duyuldukça talep eder. Apple ODR Guide'a göre bu, ilk kurulum boyutunu azaltır ve uygulama sürümünü güncellemeden yeni içerik eklemeye olanak tanır.
Önemli Noktalar
ODR kurulumu Xcode'da üç aşama içerir: kaynakları etiketlere göre kategorize etme, Info.plist'te indirme parametrelerini yapılandırma ve NSBundleResourceRequest aracılığıyla programatik talep uygulaması. İşin çoğu derleme tarafında yapılır.
// ODR durumunu kontrol etme ve ilerlemeyi izleme
func monitorODRProgress(tag: String) {
let request = NSBundleResourceRequest(tags: [tag])
let observer = request.progress.observe(\.fractionCompleted) { progress, _ in
DispatchQueue.main.async {
let percent = Int(progress.fractionCompleted * 100)
print("ODR: \(percent)% yüklendi")
}
}
}
İndirme ilerlemesi, KVO gözlem desteğiyle NSProgress sınıfının progress özelliği aracılığıyla izlenir. Uygulama, kaynak indirme sırasında kullanıcıya bir yükleme göstergesi görüntüleyebilir. İndirme tamamlandıktan sonra kaynaklar, standart FileManager ve NSDataAsset mekanizmaları aracılığıyla ana uygulama paketinde kullanılabilir hale gelir.
ODR kotaları iOS sürümüne bağlıdır. iOS 13'ten itibaren, bir cihaz hesap başına 20 GB'a kadar talep üzerine kaynak depolayabilir. Bu alan, cihazda yüklü tüm uygulamalar arasında paylaşılır — bir uygulama çok yer kaplarsa, diğerlerine daha az kalır.
Kullanılan alan izlemesi NSBundleResourceRequest aracılığıyla yapılır. Uygulama, mevcut ODR depolama alanını kontrol edebilir ve buna göre hangi kaynakların önce yükleneceğine karar verebilir. Bir yedek mekanizması uygulanması önerilir: ODR depolama alanı doluysa, ana paketten düşük kaliteli kaynaklar kullanın.
Kota aşıldığında, sistem en az yakın zamanda kullanılan sırasına göre talep üzerine etiketli kaynakları kaldırır, en eskilerden başlayarak. Uygulama kodundaki kaynak yöneticisi, NSBundleResourceRequest özelliği aracılığıyla mevcut ODR depolama kullanımını izleyebilir.Geliştiriciler, iOS'un herhangi bir zamanda talep üzerine kaynakları silmeye karar verebileceğini göz önünde bulundurmalıdır — uygulama, önceden yüklenmiş bir kaynağın aniden kullanılamaz hale geldiği durumları doğru şekilde ele almalıdır. Kaynak erişim hatalarını engellemeniz ve beginAccessingResources aracılığıyla yeniden talep etmeniz önerilir. Uygulamanın çalışması için gerekli olan kritik kaynaklar için, sistem tarafından kaldırılmayan ilk kurulum etiketlerini kullanın.
On-Demand Resources, geliştiricilere uygulama boyutunu yönetmek için esnek bir araç sağlar, ancak ağ kullanılabilirliği ve iOS depolama politikalarıyla ilgili bir dizi sınırlama getirir.
ODR'nin ana avantajı, ilk kurulum boyutunda köklü bir azalmadır. Birden çok seviyeli oyunlar, video içerikli uygulamalar veya büyük görüntü kümeleri içeriği kısımlar halinde yükleyebilir. Kullanıcı temel işlevselliğe hemen erişirken, ek kaynaklar arka planda indirilir.
ODR, ilk erişimde kaynakları yüklemek için sürekli bir internet bağlantısı gerektirir. Kapsama alanı zayıf olan bölgelerdeki kullanıcılar gecikmeler ve indirme hataları yaşayabilir. Ayrıca Apple, indirilen kaynakların cihazda kalacağını garanti etmez — depolama alanı düşük olduğunda, iOS uyarı vermeden talep üzerine etiketleri silebilir.
Sıkça Sorulan Sorular
ODR, App Store'da yeni bir sürüm yayınlamadan kaynak eklemeye ve değiştirmeye olanak tanır. Dosyaları Xcode aracılığıyla Apple sunucusunda güncelleyin ve aynı etiketlere atayın. Bir sonraki talepte uygulama, kaynağın en son sürümünü alacaktır. Bu, mevsimsel içerik, geçici promosyonlar ve yeni görüntüler ile düzenlerin A/B testi için kullanışlıdır.
Sistem, diğer uygulamalar için alan boşaltması gerektiğinde talep üzerine etiketli kaynakları siler. İlk kurulum etiketi kaynakları silinmez. Silme sırası LRU (Least Recently Used) algoritması tarafından belirlenir — en uzun süredir erişilmeyen kaynaklar ilk önce silinir.
iOS 13'ten itibaren, toplam ODR depolama sınırı Apple ID kullanıcısı başına 20 GB'dır. Optimum indirme performansı için tek bir etiketin boyutu 512 MB'ı aşmamalıdır. Sınır aşıldığında, talepler NSBundleResourceRequestLowDiskSpaceError ile başarısız olur.
Evet, indirmeden sonra kaynak yerel önbellekte saklanır ve internet bağlantısı olmadan çevrimdışı modda kullanılabilir. Sorunlar yalnızca iOS depolama alanı eksikliği nedeniyle kaynağı silmişse ve kullanıcı ağ olmadan ona erişmeye çalışırsa ortaya çıkar.
ODR, App Store altyapısıyla entegredir: kaynaklar Apple'ın CDN'sinde barındırılır, önbellekleme sistemi tarafından yönetilir ve geliştiricinin kendi sunucusunu kurmasını gerektirmez. URLSession, sunucu altyapısı, sürüm kontrolü ve manuel önbellek yönetimi gerektirir. ODR ayrıca bağlantı kesintisi durumunda indirmeyi otomatik olarak sürdürür.
Özet
On-Demand Resources (ODR), iOS, tvOS ve macOS'a yerleşik bir içerik yönetim sistemidir. Geliştiricinin uygulama kaynaklarını zorunlu (kurulum paketine dahil) ve talep üzerine (App Store'da depolanan ve ihtiyaç duyulduğunda indirilen) olarak ayırmasına olanak tanır.
ODR sistemi üç ana varlıkla çalışır: etiketler, kaynak paketleri ve talepler. Etiket, bir dosya grubunu bir araya getiren bir dize tanımlayıcısıdır. Kaynak paketi, bir etiketle ilişkili bir veri kümesidir. Talep, paket yüklemesini başlatan NSBundleResourceRequest'e yapılan programatik bir çağrıdır.
Kaynak yükleme birkaç aşamadan geçer: belirtilen etiketlerle talebin başlatılması, yerel depoda kullanılabilirliğin kontrol edilmesi, yoksa Apple sunucularından indirme, hazır olduğunda uygulamaya bildirim ve kullanımdan sonra kaynağın serbest bırakılması. Sistem, önbellekleme ve kullanılmayan kaynakların kaldırılmasını otomatik olarak yönetir.
| Aşama | Sistem Eylemi | Yürütme Süresi |
|---|---|---|
| Başlatma | Bir etiketle NSBundleResourceRequest oluşturma | Anında |
| Önbellek Kontrolü | Yerel depoda kaynak arama | 0,1–0,5 sn |
| İndirme | Apple CDN'den indirme | Boyuta bağlı |
| Bildirim | Tamamlama işleyicisini veya temsilciyi çağırma | Anında |
| Serbest Bırakma | Kaynağı sistem tarafından kaldırılabilir olarak işaretleme | iOS talebi üzerine |
ODR mekanizması, App Store bulut deposundan kaynak taleplerini yöneten bir arka plan hizmetine dayanır. Uygulama bir etiket talep ettiğinde, sistem kaynağın yerel önbellekte olup olmadığını kontrol eder. Yoksa — kesintiye uğrayan bağlantılar için devam ettirme desteğiyle bir arka plan URL oturumu aracılığıyla indirmeyi başlatır.
import Foundation
class ResourceManager {
let odrRequest = NSBundleResourceRequest(tags: ["level-3"])
func loadLevel3() {
odrRequest.conditionallyBeginAccessingResources { available in
if available {
self.startLevel3()
} else {
self.odrRequest.beginAccessingResources { error in
guard error == nil else { return }
self.startLevel3()
}
}
}
}
func releaseResources() {
odrRequest.endAccessingResources()
}
}
conditionallyBeginAccessingResources yöntemi, hemen yükleme olmadan kaynağın önbellekteki kullanılabilirliğini kontrol eder. Kullanılabilirlik bayrağı olumluysa — uygulama gecikmeden devam eder. Kaynak yoksa, beginAccessingResources progress özelliği aracılığıyla ilerleme göstergesiyle indirmeyi başlatır.
iOS, mevcut uygulama etkinliğine göre ODR kaynak yükleme önceliklerini yönetir. Uygulama ön plandayken yükleme yüksek öncelikle gerçekleştirilir. Arka planda, iOS pil seviyesi düşükken yüklemeyi geciktirebilir veya duraklatabilir.
ODR kaynakları görüntüler, videolar, ses dosyaları, sprite'lar, seviye verileri ve uygulama başlatma için kritik olmayan diğer dosyaları içerebilir. Her kaynak, işlevsel blok üyeliğini belirleyen bir veya daha fazla etikete bağlıdır.
Xcode'da etiketler, Target Membership sekmesindeki Resource Tags denetleyicisi aracılığıyla yapılandırılır. Geliştirici, proje dosyalarının her biri için ana pakete dahil mi yoksa etiketle mi yükleneceğini belirtir. Bir dosya birden çok etikete ait olabilir ve bu da kaynakların uygulamanın farklı bölümlerinde yeniden kullanılmasına olanak tanır.
<!-- Info.plist'te Resource Tags yapılandırma örneği -->
<key>NSBundleResourceRequestTags</key>
<dict>
<key>level-3</key>
<array>
<string>levels/level3.scnassets</string>
<string>textures/level3_tex.png</string>
</array>
</dict>
Apple, bir kaynağın cihazda ne kadar süre kalması gerektiğine bağlı olarak üç ODR etiketi kategorisini ayırt eder. İlk kurulum etiketleri uygulamayla birlikte yüklenir ve sistem tarafından asla silinmez. Prefetch etiket sırası, kurulumdan hemen sonra arka plan ön yükleme sırasını belirler. Ana etiketler talep üzerine istenir ve depolama alanı düşük olduğunda iOS tarafından silinebilir.
Kategorilere ek olarak, her etiketin bir indirme önceliği olabilir. Yüksek öncelikli etiketler, daha sonra talep edilmiş olsalar bile düşük öncelikli olanlardan önce yüklenir. Bu, geliştiricinin içerik görünme sırasını kontrol etmesine olanak tanır: önce ana ekran için kritik kaynaklar, ardından uygulamanın derin bölümleri için ek materyaller.
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun