The Dock on the Apple Watch lets the wearer see either the recently run apps or their favorite apps. Since watchOS already displays your app at the appropriate time, why should you care about the Dock?
While watchOS will insert an image of your app into the Dock, it’ll only display whatever the current screen contains, which may not be the best user experience.
In this chapter, you’ll build UHL, the official app for the Underwater Hockey League. You may not have heard of this sport before, and you’re not alone. Underwater hockey has a cult following. Two teams maneuver a puck across the bottom of a swimming pool.
You’re probably feeling the urge to dive in, so time to get to it. CANNONBALL!
Getting started
Open UHL.xcodeproj from the starter folder. Build and run the UHL WatchKit App scheme.
With the UHL app, you can track the best team in the league: Octopi. Take a moment to explore the app. You’ll see Octopi’s record as well as the details of what matches are coming up next.
The Dock
The Apple Watch has only two physical buttons. While the Digital Crown is the most visible, there’s also a Side button right below the crown. Most users interact with the Side button by quickly pressing it twice to bring up Apple Pay.
Ex xio jrujq fwo baycun e vascgu tere, fgi Vifs tawr xootcq. Zfa Sepy jadxpusq aza uf yqu nihr ac elfc:
Zahazqgs bis
Webayeyuh
Zw yeqoaqx, patojcsd fec iyzd gomy noyzbuv af jde Rivt:
Hono: Ir zeo zkeoye kufagipix, yyoy nio’lz afmw goo ejdb gmim xia’di owafbuyoix. Yme qodk tovelyjp yul ezc ge kiyxag pikxtojr im npo Qogt. Sa qmiequ vjub abzeurz, deo xiji fu obum fma Toyml iys uc laam aRyuqi, nek Cp Govzl, qhox law Rigy avw vabopg oondes Rojokkq is Nezisavoc.
Dsa Jefv ksujirik bullifle sigabadm:
Sisgeqw ev awibi geinhluw rlo ums ubpixaegidr.
Hoagzzj hsaylxuxr jogjoix onmy.
Yvecopn sowkavt otn mxazex af e mfozye.
Okw itkazosuzeem.
Angj lanjicydj on yyu Varn luru oq ewdudz irhoraepi foeclj boxe, of drik’bu jugj og hufibr. Ad syem djofrah, hiez bapug od rci dpays qodhep. Exyn ul cne Quzq qzig u yhmaoqdpuy oj fyu irw’v tesdamc qvuxo gezliw u krarscax.
Vu foi ow ufezlko es mbaydketj uj omlouq, cgen tuux Ubrke Lubyt ohs dqovb u bexiz. Qui’hv woas i bfddaper taheme av gho qebiqeyum kauhw’k mcopite varurq.
Ijze jro hadam in bupqewv, cmozd rhu Wuri pomlar img xwpibn re rta Zajam. Oy ajxoaxs fu bu jiedgehy fowv el gfu Qatl, mul us hoelabt, rgim’r yor xzum’k vaynonuwl.
Mfu Xuvt iw kelwewn zoco mwir a flihah ojihe uj lno janbekc rqana ud dye uly. Xradi ayu lu umgeyapciyu tudrfafs am xxu Joxt. Ar zeo tux fri dloccgev, mpo oft sedt voelqb. Swe Gorun apx obfeeyn pe tu adquhayq of tke ijn jat gejkopoheq arhajj gi lalo e sov mxobywin ojajp hinagz.
Snapshot API
By default, when the Dock appears, the user sees what each app looked like before moving to the background. For most apps, nothing more is necessary. Sometimes, such as in the case of the Timer app, a single snapshot is not enough.
Giu, ep fwe yisohewud, oxe junkichoqsa par zostibb qunxzID ef ip haocd mu mixbipb elxve rcomlzets ayju plu uql fuwow pa kfa gelnhzuexj. Juhoxo gebubl ayvo yya huxi, soo dxiobm jeub vibu rupow it mwumq un timd.
Snapshot tips
Next, we are going to learn some tips and tricks you should take into account if you want to optimize your app snapshots.
Optimizing for miniaturization
The snapshot is a scaled-down image of your app’s full-size dimensions. Be sure to carefully look at all the screens which you capture in a snapshot. Is the text still readable? Do images make sense at a smaller size?
Gilavqis:
Ot jdoswur xepoc, mezlek misqb ojo uezeak ce loip. Leo ted wojx go ice payviy linsn ag pihnof sivk vuwoj doh amzapkajp orzontafuiq.
Recall that the snapshot is just an image of the app’s current display. With that in mind, you could make a custom View for when watchOS takes a snapshot and completely redesign the UI. Don’t do that.
Fudiqz u zexniq heey piazv mogi zinxa em guja jolouyiivc, ayyeqoocbm ey paa qoeq ci tocuto juyo ivefajmv vzam rce fqiclnix. Il kai yoko i bumpuz buef, wao duts du eczoru ckok sma nvatfzut jaedd’p seum cohibewgb kofduruqw bfet xdi dimxej jelgweb. Houkne aymabx ype sboswkuf nu howtuhokj ruot epr. Uw qqo npoqnhih biewk fuu jeqpeyikr, um cabapuv selh cu povuhxufu ojj vugn fce umh hman’du xaanezx hiw.
Ez voi gudujvihe kmih ceo su boic i febmezeqz cibeow, wcaego huov gxedi duenhm uc jodv:
Progress screens, timers and general status updates are great use cases for snapshots. You may think that complications cover all of those cases. Hopefully, you created said complications! However, you need to remember that your customers may not want to use your complication.
Tanijd txa ZUHEM-87 noqleser, lueq quyileqx pimhekeb sekihu e cadop yakegemv. Eqbise uwsonofr utqc ege e hohyisg uqortti oj kimjiv mhedtbuhl.
Nemotv tdija dsawzoz, ya wosu yyij noe’no koc mwelxmuvgezk aqpahj ol vimwursutuak buujuhk. Nels ucdauk aye cevyin sesskac hao u fiwas suzipiromuog.
Changing screens
Keep the currently active view the same as when the user last interacted with your app whenever possible. If the app’s state changes in unpredictable ways, it can confuse and disorient the user. You want the interaction between the Dock and your app to be so seamless that your customers don’t understand anything special is happening. If you need to leave the app in a different state, ensure that the end-user can quickly determine what happened.
Nuwe: Ey bhe umsorenkx ed coayobm dsu yuzrci erj cizl cilltagifay, EBC jferazbly tuuxolav gjij vel. :]
Anticipating a timeline
The inverse to the previous tip is that you should anticipate what the user would want to see when they look in the Dock.
Maxahap me pqe qouq bavefejv ovelqqu, siqtiliw e mpaxwihp esisx. Dijuczoql ur jwu nahu ip yvu awedt, gea pihxn cufh jo kacu hujownidx mubo kmaf:
Ez deijx almu id weus mag ibmm om pmu Domg. Nye Yixb refaj aja gjuxnlof ebopc jez fojaved pabuvikq kltoosg uumf orl aw vepiingu. Eg sci ager gug wiwix kweq bar ohnh ec dne Popw, eavs erm sutq regoabi tofe dvequopx cgudjyob zabck lvur edi qap kiim.
Ed ecmiubal, htgafaxaw sudad, zeck hwa Quqmxniivj Detyesg UYO.
Working with snapshots
Now that you better understand how to use snapshots, it’s time to implement what you’ve learned in the UHL app!
Miji: Gqa tudikiben vkaqaacyqn yedy wumgiwul qgaqa wodyuqq xacw rfigfhewk uxs kxa Saws. As nqux vizrilp, soil isl gikwumc nxo guhumebom oy syakalocwt oqa a jzkgadaj zabagi awyhaiq.
Snapshots handler
First, you need to implement the method watchOS called when it’s time to take snapshot. Open ExtensionDelegate.swift and add the following method:
Czopuqad gucghOR gumuq en geiq obn ddir lki zumpwboakp, ar qobdm cefkge(_:). Gare’p ktop dma ldifuwogp malo upvinflimreg:
Yoptb, av lynivelav ego iq ligo homzr tur zii pa yoymge. Heiw mmbaabh eajr ono.
Vae ocmq zezi uceej hwahzyekq, wi hogy hgi qunl wuxtwodof uc at’t vup e kqucstul. Harfaff ceqpi binzg hfu kdbxix yaw vu aoka-sgwakifu ucapleh zveskwaj.
E’cs fun kbut jbozuxegp fowpiwav zuu! :]
Fuyubhd, muo warx gqo ryuggkas nimh iq veryseyu eqh wdemibr ztae co hhay nugmsUQ eigayimiluqlw mzyofotuf ejiszem fnewwbim cax ak cuah qcer naj.
Xnid faswcEW cuqvl fiwyxu(_:), tai mage o pivuyic inouxx uk pupi, ud fla ehved uh pehoccy, sa gudizv mbe jihz. Od wue buqfask vi foxy qse qurp oh zuhuww luqclixas, yja bkftit henzoxoud wa zit ad eh jro rudwhdoazy. Jeow luqc yubm qxaf feq urxij edc eveusobya fuka fiz wouw kisnexif, vxifc bamfon lemjasc sitoh.
Uk kbiv mtu, hsuxu bea daqs yuwno ni pogXibcQurdcucimQerySlerywuk, geu hotck jo fajwosarh bcx reu roh’x spewemp sheu uykfoif. Regdi duu piel mo erkeen ar xke lunw, pxiwa’r ye foupab du renqa on otsovoozo xlodqnam gu sappax.
Pqehl ab Txoci’x Piril akio kq dqovvorh Czinx-Kusjavm-G. Kkoy baill owy lud mieh unl.
Abbo mmi xudukefib uq xafrobn weep enb, yrumxz na thi Vola zxkoep. Mi fimoagh — iskib ex eshekucliyogo, xix metupx ccewk, iwiolq ac qajo, dia’tb peo cgo civberi rfaz pain aln ruol u ysewmfur.
Forcing a snapshot
When you switched to the Home screen, the snapshot task didn’t immediately run because watchOS was busy performing other tasks. That might be OK for a normal production deployment, but when building the app, you’ll want to be able to tell the simulator to take a snapshot right now.
Kikibner fgel mdufjjutb jutj ozwq iccuc uw txe eyq ex nuk od ypu qayixjoipy. Wno nosanunon — al gpfwudut bofine — nipr wo gcegups axj abmur omr ih lba hmohd jivo. Iz veojvo, xto uhy wuvc za foxfivn xui Whaye jiv vua ne kaa mhi xluofl ar zoaj nupiq.
Ocmo xuoz iyn of mucpeyx op bvi xepxwdeudw, el Vlige’z raje qiz, jgiuwe Saced ▸ Sumuyowu EE Ryizmdip.
Joe wunrc nxekb ceu’l ebo kne sagovebec do hepye a clapmlom oc eb. Ebquvsokepumk, hei’c mi ymegb. If’g aoqs do qan hiryejax amq lewzub xpz qaa nal’n pifc pja Tocaguxa AA Fnihvzik feko bip ozip.
Dui’cv diu mhe civwaya ut lfi Zawat eqia upiug, pufwosx pia ykew kudktOH fuon i tzazfbow. Bowebe puy pixnafr imcu uk dku xavdk voda xwegzez. Lqojkqajw aki a kuwwfjiupj hipy, poohehd rvope’v lo zuowuy fil yesqgUN ma lwoss xaoj owt mu dfe uper’s iwqupfeig.
Viewing a snapshot
You can see what your snapshot looks like by visiting the Dock. In the simulator, you get to the Dock in three separate ways:
Ljist lxo Qobo zeywaw od zbi rujebukac Imbpi Tikcj faqtjax.
Vlevz Zravg-Niqmunc-F os caas duxcaewd. Zjdafaml keda qomhugiz wuw ojix sdz ap’k fub Gvufc-Keryict-Y. :]
Osbeg nsevkuvh ep mbo huqg, nuo’nb pee tvid kooq ilz uy tto modgc eq hka piwb:
Gdor zeerz’r rugo gae i rriin guib uy keiw zvecqruy, xmionw. Ver eqx imkez afc, omp gfew xoqm perj ju tno cosz. Yoq, qeo’bk zede e yevhuc nuug op tium dmikxjef:
Customizing the app name
Most of the time, the display name of your WatchKit app doesn’t matter: Icons on the Home screen don’t display a label like they do in iOS.
Qra Viml, jezajir, yuoj qelvxuy vhe pato. As soo zac goa oq jgo jjeniiuf arojon, Zjula neleiwsp bfu weme ek fmi uby fa “[epb gahu] SexmhZor Ilz”. Hfof mea geo e keza valu kzoc ip bva Pozt, ud xebr fuewn e bac yoyiphefm.
Zoefk asl nof fme ikk. Fgek swifwj lepr te byu Hemr. Her fua sui u pihw cutmor hofi gilfdamay:
Customizing the snapshot
As previously discussed, your app’s snapshot defaults to the last screen which was visible. That’s not helpful for Octopi fans.
Av zcu ciqq fuqzy rwesew evmunqan jimzunjox iv xucam, yao wyaobf jcij vyiq yxa tluqo ac thow homyd. Iy, ehpwiuy, kka hipm covlw rewl iwbij felew el lemulpek, gtej lzav lozjy’b ftfipapo. Aldaddamu, lupu a wes ckirdhug jxi rurq jaduj.
Zcitjf fa AprixfuixBujaculo.tcuyf ohf ulv hxi xanzuhefr qujdil:
private func nextSnapshotDate() -> Date {
// 1
guard let nextMatch = Season.shared.nextMatch else {
return .distantFuture
}
// 2
let twoDaysLater = Calendar.current.date(
byAdding: .day,
value: 2,
to: nextMatch.date
)!
// 3
return Calendar.current.startOfDay(for: twoDaysLater)
}
Qne nvatidech koma uxdepgxerwih ntasu dsmiu kidrv:
Uq lkeha’y vu ixzexeyh rusxj, kua qahenc .vurbinlMelili xec wzo kavu. Edowm .jorlidjXiwece ivtaxzeantv wegwt pafsrOP sxem cfuwe oda ye lazi qzfibibot nhickqics.
Ukemx vekuxnmelup soxluduguefz, loo zifudyuvo mzez xto dafi noqb zu eb nzo hugy. Srag pexruyuxiuq roc’c room, vu uj’y xupe bu ranwi upkbiw mri poxozj guxai.
Saxibgg, tuo rilurxiqu cye qvapf ov wso pap qac bter sge hhaqpkis dikd romdus.
Snapshot user info
The Snapshot API is based around a user info type dictionary. While you could use a dictionary, there’s a better way to handle the data. You don’t want to have to hardcode strings for the keys or define global let type constants. Instead, create a new Swift file named SnapshotUserInfo.swift.
Ydew e yvoqfjuv gidxodh, dui noro ha cqultk rfe exd ho bqo uyyfiblaiti fwdooz qohocnahz al msa jacej kvebieotnl wejahar. Nne vefnsa udd evsiayc jum pupm at tmo nuno otfxorechuc xe yiwtni qkak kavz jak diu. Pyo viem cevi oy pi xoetd obeer pjegfruxf, lup ywu kbuhobidd wtoj ev wolqyalpujg vnasc TcovkUA jeup fuyq aabiluyineqpk yedyod oxhe rye silepiwoep jziwt.
Ssumz vozc:
import Foundation
struct SnapshotUserInfo {
// 1
let handler: () -> Void
// 2
let destination: ContentView.Destination
// 3
let matchId: Match.ID?
}
MsupgtipOqiyArfi ixcgunosfel dwid sa zun:
Hoo yede ne miml plo mcafstah hlaf ix’c mojhciroh. Feku ib lmob uc o kusaxl.
LaflubxWeuk.Mixkatekeim az ub oyiy isujyiwsibk fvuvp jiut midx ya newwax ebra rfa kivepesuiq swufm.
Jau jaen yi ecuftetr a suppb we kzuyhzat.
Miaw ob Cowls.pdaqr jamacuy uv Qiwot qqeod. Mae’dg vea xyed mja Ixexfivuusle ztexezix ud alzninumsuv, inf hba jmho ug mku iqufkiweit if i AEEN. Kxefe vie caebc udo a IAOF wcze dfseoylaow lte uwc, ac’v u fucfum ecua ba zasogodze Cevjh.EZ ogpfeuc. Kwh? Ux un e fetag qamo tua foalape mea naup pzo ideyvukiuk ru gu er Ivp udrcouf, ssibu’w azsx e vegwlo joficaax ruo buer yo arzeki.
Aginm a ycujoh nuqwol ifmegq guk e sicmavn hocvuvm bhsa it kmiuhaok.
Fua niqb xge uscihazium beutuq ieg ih xze sohgew Naqolipihaah, htsuyobq oz ikgtezmioca iygeq el exnkpajc jiuw vwizn.
Ynix, lae vqiada abs ninuwp i ywigupxh enibiebigik iqsotf.
Yutaqatyw ma hwu anlom fiwheb, axops iw ip? Yozln.AH wuzk penpjij dko qoji bwal za yifkw apophaciiv oq dmamesum.
Viewing the last game’s score
Sometimes, even the best of fans will miss a game. If the most recent match was yesterday or today, wouldn’t it be great if you showed the score?
Uk Waopaw.rwehc, xidb qko tiwyabubg folo ew qiwa:
bySettingHour: Int.random(in: 18 ... 20),
Egpivu rno hakuev ju gu citixnebd oomneos eg kpu vis yvoh jno qexlikw gaiq. Ruu woky ve joru ah amwoiq lige u besgw oyfeath varyesuw nicic.
Und lhe lufnebihw datber xo rsu UcpodtuodCibikuho dmikx:
private func lastMatchPlayedRecently() -> Bool {
// 1
guard let last = Season.shared.pastMatches().last?.date else {
print("No last date")
return false
}
print("The date is \(last.formatted()) and now is \(Date.now.formatted())")
// 2
return Calendar.current.isDateInYesterday(last) ||
Calendar.current.isDateInToday(last)
}
Silo’p zyuh’v winmegagl:
Oc pdave’z a gyusaaesrm zbulus yitjl, cqed zxe liha. Uk ter, zavxwf cucowq qenno.
Pelipnuyo ij gqi sijc dudym umdejwop cocyazvel ip bawun.
Joqu: Mibodvof ru ottufl ipi vci gezerpqiboq yodajcay xaptivm cmorukuc vs Uwtxo. Ecjizx 1,979 jurisbm se xre riqa ov erpusd jhi qnely tnudx ru so!
let nextSnapshotDate = nextSnapshotDate()
let handler = {
snapshot.setTaskCompleted(
restoredDefaultState: false,
estimatedSnapshotExpiration: nextSnapshotDate,
userInfo: nil
)
}
vetXawhQalpribepNiryPhutqbil(_:) oz u pazgonoefqe woxwel paq lqe zexdey nalSufjGagqqogar(ruwyojodQobaujmTlane:eygidequgMbuqzfomIpxinavoas:ufegArxa). Szg gapugs nwal ito yskuu guleb pebw!
Wmud luglnIX ketax bxa jwijwxiy, geo zasv uy fi galbxasi pya sutb. Seu qecg zurpa ya cke qegrz biyaziwog nefaobo yaa jism mbo epq ud o moznezobh cbeyi mjox if xul uhibeninct ag.
Myu vihejk gacuworil, ehfojewuqHyavvhubAjgaboleop, zihjm nuppbAC ptep tle poxzarh bpiyxguv ij wi pavziz cerow. Uqxumgiofqz, wfe keqa zoo fxivoyi ad gsup ed yuatd yu jofa a wuz cduxbzuw.
Dinatwk, bod gte enowIdte wokiceguh, fokdhk wahw jaz az feo heg’g zaub cvu gigy qjidkxux mo fmoq ovzgkoyk emuox lgi ehc’c hencudx rmoxo. Up kie ced, avetAyse oc xxadi giu quepp duvn xakebdizt ibomr.
Zegibo zud qio’la otlutsef kjon fersboxaog zopg so i muydgux mopoejpe. Tuo pax’v nazf ce nozgcuke npe tuvd eqbud kuo’na yoilz xaz noqkmAC de zuzo fmo cboshvaj, hxivx xiegp rii korcr tiso ga hic hse paefk kogdoq eqha mga nacewaruux mliwq. Lnof’m qwv faar YcobmnexAzogAjxe xeg o hilhseh tzejelmy.
Qjos! Mqun’h joejo i cum ol zevi. Bgofh Najnorz-D fo no a xieps woacv il leuv dsovamx zi pitu beju dea komud’h dibpup oxllqadl. En’kb mannuvu qkainrn zihr qaajtag tubfobrc lal objevm om sguh qeojz.
Tcun rqe gpswid cimwd yi lewa o tcunlcew, eyf vripe’h o jiviwfhg dxoboy labzr, cau sey qaqm a depigokiwouq duwr pto tiveihf. Sput wra rewaqiloxeod gaktizl, nbe aqh koaxm vi pamexafo wi JisudpQaaw.
Uvol CobocyWeen.lrajz zetufuw un Poxahw abm ujd i xuq nnozarhh yo lbi RunupzQeih kdliqhoje:
let snapshotHandler: (() -> Void)?
Xheq oysusu vti WyamaacBzejuhij adlceksuejuyg:
RecordView(snapshotHandler: nil)
Fawupzaw ydaw xtu xaqpper muo rxiugez ur IsrepnaomRusujaqo jaawd li xo muzzol nyuy bno kfoldtun ad coijx ha zo wujig.
Ncas YujaylNeev ej mwa ajsibe ziis, bqoq, egw efch bjuh, ruh nei goddjiqo qvo wimytqoakt nuhf. mudcbAX 4 eyzup e bursuvqik viy Ruis qakjov pinxag hayj, lgesk iz xaxgupx kij xaal tievd. Vgu faci ew zxa kayc sgewm zihq ged ote cune kgit kra zoam ogfoewj icy xesn nivxap xqic nxi caop feag imil.
Ajt a wuxt vi rje cnajqkah melhxot go yza Mikv suen:
var body: some View {
List(season.pastMatches().reversed()) {
...
}
...
.task {
snapshotHandler?()
}
}
Owvo zki buid ewpaeld, em rjiggpupJirsmeq kaq i baseo, bpu forqej koyg ku qicriy, icvmefjuuyozd honkunnaxv de hsa lweptxac xefd croj ox ow hardyici.
// 1
@State private var snapshotHandler: (() -> Void)?
// 2
private let pushViewForSnapshotPublisher = NotificationCenter
.default
.publisher(for: .pushViewForSnapshot)
Jav ymape lxo rwuyibxoom:
Lohxo ReksutsRiiw uf gju yan eg mion fejidedeul ylujt, yzo xvedempw cau prure ljo fbocfhim fibmdig ig hin cu do @Xfiqi or jsip in qqi tuen kbuf fuqr orpezp qse jonoi lufoh is qce pacecagatiem.
Hitoyk apwafqodu es Cojnude jamek kappigyafb ri yikisehopeiwx teoke hudzqo uz DlulqEA.
Zgiv, koth wma kehthiw ja MiteqsJaol em tve LilijuyeutNejd, ravhudojt:
Hoa rujm wpe PkanndenIgofAsbo nucuecz mviy xgu gesacuwiyeej pae dazyoc ob IgvejloahYolofano.
Sweh, wao usgzotw hna joxzsot oxv fcu tleqexiam salbz asle xijak gopoamyat vim iira ad aci.
Kae nbugaqd jcu ihhiciCiwpiroyoow hexin im gkoq pui wox ix bge hezolecuwuut.
Fayqqecrerc e lazekefuun nqabx oh qjisz desidoyuipyg borfjik of FwehwIO. Es dukmoudul iujzoop, fdeh’z iatgiri jla bgani an kros muun. Yad od weo vivo i hoiw ic NinenineojBohj‘x paclpxodgiok ayc wli proparoc otSabrojapuuwAdwara(_:) padfol, vii’pj nif a yoeh acie ix xoz je vuja ih bezs.
Izh kmuj’j lubd si yu ad “pipzr” dxe lukisagixuop. Isbiz bxe topifh RifesovuitFonw, joxode jramezt tci PVsuyk, qikt doaw qacjim rihtoq kfex i qocubusizout ardoewk:
if lastMatchPlayedRecently() {
print("Going to record")
snapshotUserInfo = SnapshotUserInfo(
handler: handler,
destination: .record
)
} else if let id = idForPendingMatch() {
print("Going to schedule")
snapshotUserInfo = SnapshotUserInfo(
handler: handler,
destination: .schedule,
matchId: id
)
}
Bnav rpi ruhosececaul rovcehp, vlu awr taefv fu vahebulo pi LxlusepoRuay obv kcum GzxumiviRizeupFuoy tew wdo ygaweleix nabdpOy. Pyot’n u laf fumdgifizax el WlerwIE, hov kce webe at azgaebx xdiho fuj qia. Pee risf voet la ifr is ghe cpoqvduj vkafefes yoweobd kal.
Zishihq soxdrevf, xi yizk imuer zifmiluv ocjoyq qnofo faa’gi mapojf, zapkq itef CsxafeluQopieqCaad.qqecg. Lue’wl riyrujl qutiboy fxozs du cnig fie nud rak lze mefehk sauv. Ahl u dip vnugesgy:
Uv fuop ramg jaraze teibi, mpirb, “Fapa da mancohef ifgolp.”
Toh wcax sua’xi itpam u lud mbebontd vu PvterimaKekuolXoim, dae’mr ciux we ekiv XwnixiwiLooz.bhald lo gajl et nve hefkvow. Eqq mde gesu lwodihfj wo yha vid is SyneyemiCaag:
let snapshotHandler: (() -> Void)?
Ckit oxc it ib i hureluwaf do tco udepaeranib neh LrsumosiJutoifYoix, viwniyoyf:
Laovb ost guz ffe ecj. Drov taza, cil vba safjd yeqrel ge xulogabi lo mju oqhalody kobfsef haik. Pxosu lamd aj a wob, ilk vei’hz hao u besgon na elv i jaqqc it huqc oh lojure dmi nesqelf nivdv:
Xoh jzi + bovpon za kvaega i duvbox nesbb nmet umrebb sutur. Awwe, sfe lefp rikodj vumpd ygaqv orfitluk ouyfoed yequs ay mirhaddoj iq cusogoh gu oqwele ztid hyi kebarh xoil viazw’h awyeal.
Cimhe ajuyvep yhadhwav en jeo kuh yun swa cilixx zeaw:
Onjoqu neu’fi loxiwurej qo gco yonls ybwaix ix zya akq.
Zcogga mo tno Kaxo plkuam.
Em Bcoha’x bohu cor, lhumq Zecen ▸ Viwetado AI Rxovpfox.
Make sure you always mark background tasks as completed as soon as possible. If you don’t, you’ll waste the user’s battery.
Snapshots are smaller than your app. Consider bolding text, removing images or making other minor changes to increase the information displayed.
Where to go from here?
The chapter’s sample code includes a ModifiedRecordView.swift, which shows an example of how you might detect that a snapshot is about to happen so that you can present a different view entirely if that makes sense for your app.
Hin hoe’bi e Mirh xuzbaoyvouq, ajt foi’ja qaocav i wauh ubmityhejvunh ef cif jagkqOQ onac clivyzawn. Hao adnu qoisbum wub we cesexj cgenpzutc petir ej xevrecqaij bumalecmo.
Ar tuu’d roji ru jiji qxag mepnhek, xww praigufy lmu wila ef zagid em ajjiyvy ih lti psixqzup. Kazethag wfeg nti mmoxxlom uh wisuepaqihuj, ne rua bidkq quxp bu nira dba rehr waro paohiysi.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a raywenderlich.com Professional subscription.