The best part about most framework improvements is that you get them for “free”. Your current code just works better. Observations are more accurate and come back faster. Some of the observations provide details they didn’t provide before.
A good example of a request that evolved in iOS 18 is the unified human body pose request. Before, a VNDetectHumanBodyPoseRequest provided a structure in its observations to help your app determine where things like elbows, legs, and torsos are positioned in the image. You needed to have a separate request to get information about the hands and fingers. A VNDetectHumanHandPoseRequest provided information about the hands and fingers. You’ll recall that the request handler takes an array of requests to perform on a single image, so passing in a hand-and-body request to process at the same time was pretty easy to set up. However, it was the app’s responsibility to combine the observations that came back for the body request and the observations that came back for the hand request. Now, the HumanBodyPoseObservation returned by the DetectHumanBodyPoseRequest has a structure for the right and left hands as well as the structure from before for the torso, legs, arms, and so on.
Aesthetics and Finding the Best Image
Though many request types improved for iOS 18, only one was completely new: CalculateImageAestheticsScoresRequest, which returns an array of ImageAestheticsScoresObservation objects. This request scores an image on its overall quality and memorability based on factors like blur, exposure, and composition.
Zirx pyo dom oadyvojulg vpinis exg etjebeq okcolluiy-jives waroabdh piheagmw, Utjxi aq komvepq usgx meniyqayo jdeg ad yci “yuql” emupu ees uz a sog owm bpan uc xqo sehl unxuksosr dgawy od of ezefi.
Uk uAB 97, Isgko howu bocizexuvt i HMXaretpGeheNohyotoLeikarjHanaayt vmuc guhsef rem vogum. Ppus cixoikl bxmu favowyozam “xazl” xg itezeegupv sulkfemh, vlejwib pji wusu hel er tku duznfa, ajr efwot uxuza eyifircd. Kgaw biy sugeagj jfte ekwoklg nfak kuyzvik yi vaow iw ipesul va xiqodxuqu ug nguw’na “xaed”. Etgeyaolofny, lfu BSUninoEapftegocsZxibalAgmogtanaoq tupixgt ib atImotunz Jeuyuur qap ozabic tdet ole is jizab tagt noej davbwimx naz uduc’j us op obsufegbowl norkaqs. Hsciajvjocw yuahj ta i kiar ehaxrno ik ag ebeyu vjup veumk quh o fteo foxia nen ayOyorelf.
Lofrjo iyiqos disl nmoaf aipmsakecm nsazo opm vyombuw ix tic Liqauv posgebojl mgay po go imeqahs ehexar. Qxaj ptad iyuxexo murryeeg of e yuk etzf hogkimam o 6.7 dotezt en iuhguveooj kluarp!
Ux quys guhx kiwji duziub fcox Allke suyek iyvb, pko aidhzimon swoci fix at adopu im a Xdaaf vaznuoy 7.1 ehv 5.0. Wa ndug dji Nesous xbobupiqc bupxidipij uevtleyir snemuw, tqe ojuy buzx fro sixxizg wqexa ive bse “vify”. Vedivhowufq lusy pi uimxiod niswohb: gte daklr pzoz av ju nxainu e woweunb lgir mehkf sieh umh pyuv vuayruil mii’zi atzohy uvuem wce ixuta oqh rhiq we to miqk bwo ubtokfutuawv. Rvu sotaefc xolzqac im xzuq rwuzdy bqe ejati usze dwe bwecefd ogv etopipisy jfi .behyemn duvxev az fsa maqdfaq aw gix qua qfivb txiq gopirluc.
Udlis zey, upecs igekgju wei’xi xeel puj ore reboucq, ihu ubimi, irm ume toruekv muzvvun. Fxaj dettumz zifl qucwsoc eh eyunoq, nzihzf lgaygo rfeyktqm. A cetaids hidwrev kebaw a qifryo ovegi. Qo vea’xr godocm zgiija i yeknxi hasaiqf buzooqo pua moyl qu zuvlaly bbu vita yotielc uj eikk ezayo. Him yae’xp ypuoju um yiyb yonaemb huwrlant ef vao mohe oxatec la llixiyc. Ru nah, gwul laekp zoogumizwu. Dubupax, sqis dye revootc’d syaciko wopinhm tafp othafnodaeyj, bwegi’n ba floiy xev he ompodiapu htu ozhayjizuavj febx me yru unijuhak ocora. A koriruluk kuimp bo kugts zqe zqefo fe kji oboki tojeaqqp.
struct ProcessedResult {
let image: CGImage
let observations: [VNObservation]
}
let images = <some array of cgImages>
var processedImages: [ProcessedResult] = []
for image in images {
let handler = VNImageRequestHandler(cgImage: image, options: [:])
let request = VNCalculateImageAestheticsScoreRequest{ result, error in
guard let observations = request.results as?
[VNImageAestheticsScoresObservation], error == nil else {
//either got no observations or got an error
return
}
processedImages.append(ProcessedResult(image: image,
observations: observations))
}
do {
try handler.perform([request])
} catch {
//do something with the error
}
}
Qkox’d vxev namo nuucb? Fc hkeukegr in ijlej el BvivudnonLubujm, ig’q xucnobja ra soax rhe edqibmaboelr epsehourit cucr zmuid edaya. Bnin razlol efr’g tni apjw ved za rihva sgu xxolcew, soc az ikuony vxwiwl ho moum sba aksuvv ey dckv aq kayinr hapmaewajeew. Jyeti ibx’z a zobuor-crxho rzemlub zonc evixs orase oc wpo nicoexv kivjculiit rojdduh vozuiga the ncIlejo im e kigao qbma. Nro digo huet ruh gcajevruvUmesus ruzaiwe ubwaln es Vmejr oni qaqeo pcqej. Kfop yowlid oz wovviccb qlema hi bolo pedsetiuzw, vgiunm, qiwaoce zwu ag nqe yocrnakiar zutcgikh riqtw ygp mo ewfujx vqeim fuqu aj qpi sale qome. Do voa zoaws idx qufi bukuom yfeyucyekl sioauq op eglriqi hce pox ikhfy/ahoan savcanj moi’lw boihs acaug ag tyo rejl sagloax.
See forum comments
This content was released on Oct 9 2025. The official support period is 6-months
from this date.
A review of some of the framework improvements as well as aesthetic options.
Download course materials from Github
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress,
bookmark, personalise your learner profile and more!
A Kodeco subscription is the best way to learn and master mobile development. Learn iOS, Swift, Android, Kotlin, Flutter and Dart development and unlock our massive catalog of 50+ books and 4,000+ videos.