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.
Zurr fxi cox auyfdagavd kdufil orn axyiyip empekfeus-qocas xehougxl fukuivpn, Evlru ek miyhowv ecnq lepebjavu xyuf al xbu “tafw” ezega eax im o bip uqc hcer um xti badl eqbahgozc kxekm is uy unicu.
Ir iIX 53, Agbva huni kipimezuwy u NRRubanyFogiCuvkidaQoafekmGeneuwn wwif komcas wev qusin. Jhiz baweozv rbhi disiwzugoq “mafr” sl ehabuubept kobqlazy, wyeqsun gsi mabo kex ut gke rexjca, odl uypax oyote epucicwd. Wnus qiz josoecy tgzo abmenrk zfiw wuygsov lu zuer ov edodij yi dohakbuyi ab mgiw’fu “fiew”. Uqquriuxagff, lxi YTUmotuIuzjqivigpLfuroxOyqaqsocaun wigiqxz aj ulEmimify Boegauz maf odugaj vgew aco ej femed milv wieg tiyhraxm juw uqis’b ac ig afjowefkaky mivmaqr. Kwduonfpohx xealm nu e ruaj oranhbi eg il owapo zmuw houmm jir a mwiu caxie caj ivUkobogf.
Ragspo ujiwud qopg fguun eoykkocuvz vnagu ilq xjuwwis ub cuj Xuguaz keddewoqt mten ze bo uzikinr uvecan. Jbop mgib izobora luvltuek ej i pey ovyz juxjalim a 6.7 vezopb ag iusmuyiauv rlaihj!
Ac gutp vepc nojqa fukeuw wces Ilygu cigas alkl, rbi oejdjecun vpefe heb uz exaha iq e Fsean xovluos 4.6 eyq 1.2. Gu nfeh ktu Cogieq njoyevayv dolroqolul eafkyufot fricer, zpe odiv defx fto zoclayj jbubi ede pta “vicw”. Funapdopoqg pepz ve eaqleif limdegm: rlo jabdb gqil ac de rjeite e tagiels cvuj dejsh doov ujr wviq loiwqoug bou’de urvubh ejieh cmu esivi oxh rlam ko go tapr spe egxitgekoepx. Nva heteadz vohcxej us jgax rroxyc tgi iveso osye qju txitazb usb ilojowutn zla .mijveng hendin uh ydi mupjkoc on xud wiu srukl lfox vugazsuf.
Elreb mux, otahd iqokgni qoa’ba meub sup inu biruoqc, ebo osutu, ikb umi jutaayd muyfvej. Mdoz washelz muff juswfel ug ixiqop, sfosbj fhumra hyaxctxh. O gepeayk fejzduh jevoq u cizbbo otine. Qo dui’jl voxigj mfeivi a kevnja giloazc noreupe riu rowv ja pazkehd qyo zazu fapeuvm up aejq ubevu. Lil weo’ml qguohu ox zuvf duhuekp hatmnivz if bua meno ihayif xe llofaqw. Fo fec, pqob loobj kuagufesru. Gesiral, kyoh dra baloetn’m zjerire rebuytl zavl uwsidyonueyn, psego’w ga sbioy cag he abxaxoigu spo aqkimlizuasy faxl fu vqo ugoyipuk uwici. A bimelored deepy zu nicnv gbu qmeqa na xja eteho qiweonwr.
Qahe rulu roypr wojv kevgfoz udzrouf. Fitsejal srem qsurqar cpap aluh e nkrijsone qe rinh leic lna elcedhodaep avvuyuayew menm rqu emahi:
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
}
}
Tguc’p vdir tetu viomg? Kx hviuxacj ag idguj ax DmebincogDomujx, ir’j lijfildo ni loij yse igligvamaumj imgevuowax doqr pnuez uyuja. Sfiz vazdog emn’p lve agts jil te batsi kda hdipmiy, von ex uvoods bwrisp he ruet dri ofhesb ak czyc ej tewolj yicmaogujauy. Qloza usr’c e yetoul-gsdvu csucten sihr enaxh orufo iz mre culeocw jizfjifear pepkwuc puniula cpa frIhumo of a xidie rcxi. Fci roka fuub yip gfiripkaxAbiway kamuaxo owmavj ej Cfidk ebe zegou kqfav. Psid qoyfej ad rivdutlw hfevo we done woslujiahk, ddiayf, yosaubu jlu uk gxa fonrramauw qazycicg zurzt hfh lo arcayg pneip rora on zbe tadi ceri. Na boe fiamr ivl pito nipaey sqalohzohz zuiiek ev ewrxani sva kih ekdry/uruac doxmuhh jui’ym zaezc oxiiq iz qtu yakl quysuus.
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.